科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道教你快速解决“一个多对多”的疑难问题

教你快速解决“一个多对多”的疑难问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将教你快速解决“一个多对多”的疑难问题。

作者:赛迪网 20361 来源:天新网 2008年3月24日

关键字: Mssql 数据库 SQL Server SQL

  • 评论
  • 分享微博
  • 分享邮件

问题:

A表
syno seid date bnid num
667 10229 2006072816:57:41 12 3
667 10029 2006072819:10:28 12 7
667 20007 2006072820:01:26 12 8
667 10229 2006073007:11:22 12 9
667 10319 2006073111:09:56 12 4
667 10229 2006080110:56:38 12 1
667 10229 2006080211:06:38 12 6
B表
syno beid riqi bnid 
667 12007 2006072815:08:40 12
667 12011 2006072818:16:45 12
667 12012 2006073009:10:42 12
结果应该是:
syno beid seid sum(num)
667 12007 10229 3
667 12011 10029 7
667 12011 10229 9
667 12011 20007 8
667 12012 10229 7
667 12012 10319 4

说明:

A表B表syno,bnid相关,相同syno在A表中的记录日期date总是小于B表riqi,

要求:两个表相连后按照syno,beid,seid分组,计算num值,

如果B表中相同的syno有多个记录,计算时要比较A表B表中的日期,

判断A表中的日期记录在B表中的时间段。

解决方法(参考示例:

CREATE TABLE Temp1 (syno int,seid int,[date] varchar(16),bnid int,num int)
CREATE TABLE Temp2 (syno int,beid int,riqi varchar(16),bnid int)
INSERT INTO Temp1 
SELECT 667, 10229, ''2006072816:57:41'', 12, 3 UNION ALL
SELECT 667, 10029, ''2006072819:10:28'' ,12 ,7 UNION ALL
SELECT 667, 20007, ''2006072820:01:26'' ,12 ,8 UNION ALL
SELECT 667, 10229, ''2006073007:11:22'' ,12 ,9 UNION ALL
SELECT 667, 10319, ''2006073111:09:56'' ,12 ,4 UNION ALL
SELECT 667, 10229, ''2006080110:56:38'' ,12 ,1 UNION ALL
SELECT 667, 10229, ''2006080211:06:38'' ,12 ,6
INSERT INTO Temp2 
SELECT 667 ,12007, ''2006072815:08:40'', 12 UNION ALL
SELECT 667 ,12011, ''2006072818:16:45'' ,12 UNION ALL
SELECT 667, 12012, ''2006073009:10:42'' ,12
go
--建立函数
CREATE FUNCTION Get_beid(@syno int,@bnid int ,@date varchar(16))
RETURNS int
AS 
BEGIN
DECLARE @RETURN int 
SET @RETURN=(SELECT Top 1 beid FROM Temp2 WHERE syno=@syno AND bnid=
@bnid AND riqi<=@date ORDER BY riqi DESC) RETURN @RETURN END go --计算过程 SELECT syno,beid,seid,sum(num) FROM ( SELECT syno,dbo.Get_beid(syno,bnid,[date]) AS beid,seid,num FROM Temp1 ) AS SUM_T GROUP BY syno,beid,seid ORDER BY syno,beid,seid --删除测试表 DROP TABLE Temp1,Temp2 DROP FUNCTION Get_beid
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章