新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > 数据库 > sql server教程 > 正文:教你快速解决“一个多对多”的疑难问题

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

新客网 XKER.COM 2008-01-28 来源:赛迪网 20361 收藏本文

问题:

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
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐