日期:2014-05-18  浏览次数:20818 次

请帮忙看下这条SQL语句怎么写?
具体是通过,充值表和消费表,查询出某个时间段内的一个充值总额,消费总额,余额的sql,具体如下:

[B] 会员充值表: sj:充值时间 je:充值金额  
B.id, B.uid, B.sj, B.je
1 张三 2012-02-01 200.00  
2 李四 2012-02-01 100.00
4 张三 2012-02-15 100.00

[C] 会员消费表: sj:消费时间 je:消费金额  
C.id, C.uid, C.sj, C.je
1 张三 2012-02-02 200.00  
2 赵六 2012-02-05 100.00
3 陈七 2012-02-17 50.00


想统计某个时间段内,比如:2012-2-1 至 2012-2-15 的 会员充值,消费,及余额表,统计结果如下

uid, 充值金额, 消费金额, 余额
张三 300 200 100
李四 100 0 100
赵六 0 100 -100

我知道正规的应该有个[A]会员表,如果有个[A]会员表这个就好办了 就可以 left join group by 来做。
但是现在这个[A]会员表,有些会员被删除了,就是说会员表里可能没有这个会员,但是却在充值和消费表里有这个记录,
所以现在就不能考虑[A]表了,只通过[B],[C]表来查询结果,要求起止时间和uid是可以输入的变量。

请高手帮忙,非常感谢!


------解决方案--------------------
SQL code
create table B(id int, uid varchar(10), sj datetime,je decimal(18,2))
insert into b values(1 ,'张三', '2012-02-01', 200.00)
insert into b values(2 ,'李四', '2012-02-01', 100.00)
insert into b values(4 ,'张三', '2012-02-15', 100.00)
create table C(id int, uid varchar(10), sj datetime,je decimal(18,2))
insert into c values(1 ,'张三', '2012-02-02', 200.00)
insert into c values(2 ,'赵六', '2012-02-05', 100.00)
insert into c values(3 ,'陈七', '2012-02-17', 50.00)
go

select isnull(m.uid,n.uid) uid ,
       isnull(m.je , 0) 充值金额,
       isnull(n.je , 0) 消费金额,
       isnull(m.je , 0) - isnull(n.je , 0) 余额
from
(select uid , sum(je) je from b where convert(varchar(10),sj,120) between '2012-02-01' and '2012-02-15' group by uid) m
full join
(select uid , sum(je) je from c where convert(varchar(10),sj,120) between '2012-02-01' and '2012-02-15' group by uid) n
on m.uid = n.uid

drop table b , c

/*
uid        充值金额                                     消费金额                                     余额                                       
---------- ---------------------------------------- ---------------------------------------- ---------------------------------------- 
李四         100.00                                   .00                                      100.00
张三         300.00                                   200.00                                   100.00
赵六         .00                                      100.00                                   -100.00

(所影响的行数为 3 行)
*/