日期:2014-05-17  浏览次数:20652 次

困扰我好多天的问题,求帮忙解决

表代码:
CREATE TABLE [dbo].[c](
[帐号] [varchar](50) NULL,
[媒体] [varchar](50) NULL,
[注册时间] [datetime2](7) NULL
) ON [PRIMARY]

insert into [dbo].[c] values ('qqq','tx','2013-06-05 00:00:00.0000000'),
('qqq','pp','2013-06-23 00:00:00.0000000'),
('qqq','xx','2013-07-05 00:00:00.0000000'),
('wwwwww','pp','2013-06-01 00:00:00.0000000'),
('wwwwww','fb','2013-06-15 00:00:00.0000000'),
('wwwwww','tos','2013-06-25 00:00:00.0000000')

CREATE TABLE [dbo].[d](
[帐号] [varchar](50) NULL,
[充值金额] [money] NULL,
[充值时间] [datetime2](7) NULL
) ON [PRIMARY]
insert into [dbo].[d] values ('qqq','12.00','2013-06-18 00:00:00.0000000'),
('qqq','33.00','2013-06-28 00:00:00.0000000'),
('qqq','55.00','2013-08-01 00:00:00.0000000'),
('wwwwww','10.00','2013-06-03 00:00:00.0000000'),
('wwwwww','20.00','2013-06-04 00:00:00.0000000'),
('wwwwww','20.00','2013-06-16 00:00:00.0000000'),
('wwwwww','50.00','2013-06-26 00:00:00.0000000'),
('wwwwww','33.00','2013-06-29 00:00:00.0000000')


上面两个表,
帐号wwwwww 6.1号从pp这个媒体注册进来,然后6.15号又从fb注册进来,然后6.25号又从tos注册进来
那么这个帐号的充值
6.1号到6.15号的充值算在pp里面
6.15号到6.25号的充值算在 fb里面
6.25之后的充值算在tos里面
要最后得出的结果为:
wwwwww pp  30
wwwwww fb   20
wwwwww tos  83
qqq    tx   12
qqq    pp   33
qqq    xx   55
好心人帮帮忙啊,想了好长时间了想不出来
select sql

------解决方案--------------------
楼主要求是的分时间段统计,如下:
select a.帐号,a.媒体,sum(b.充值金额) 充值金额 from
(   select 帐号,媒体,注册时间 注册时间A,
    isnull((select min(注册时间) from c c2 where c1.帐号=c2.帐号 and c2.注册时间>c1.注册时间),'9999-01-01') 注册时间B 
    from c c1 
) a 
join d b on a.帐号=b.帐号 and a.注册时间A<=b.充值时间 and a.注册时间B>b.充值时间