当前位置: 代码迷 >> Oracle认证考试 >> sql的统计疑难解决方案
  详细解决方案

sql的统计疑难解决方案

热度:171   发布时间:2016-04-24 03:49:44.0
sql的统计疑难
有一张数据表carduser如下:
卡号 支付金额 余额 支付日期
1511710 27.9 172.1 2006-10-3
1511710 103 69.1 2007-1-2
1511710 69.1 0 2007-5-1
1511710 282 218 2008-1-12
1511710 105.2 112.8 2008-11-11
1511710 53 59.8 2009-3-5
1512833 100 0 2006-12-20
1512833 37.5 262.5 2007-4-10
1512833 118 144.5 2007-7-2
1512833 95.3 49.2 2007-10-21
1512833 49.2 0 2008-2-15
1513545 105 395 2007-8-22
1513545 200 195 2009-10-5
.......
如果想统计每年底各个卡片的余额之和,应该怎么写这个语句。
如统计2006、2007、2008、2009年底的余额,对应的累计余额应该是:
sum2006=172.1+0
sum2007=0+49.2+395+...
sum2008=112.8+0+395+...
sum2009=59.8+0+195+...
注意:
1、2006年只有2张,所以只要统计2个数据
2、卡片1513545在2008年没有消费,所以2008年底的余额和2007年底是一样的
3、同理,卡片1512833在2008年后没有再使用,它在2009年底的余额就是2008底的余额
因为涉及年份缺失需要取上一年的数据,这个有点复杂,大家可以建立中间表,按年度进行统计,每个年度写一条统计语句,不要求一下得到所有年度的卡片余额之和。

------解决方案--------------------
那么我在17楼给你的查询记录用的SQL你有执行吗?执行结果是什么样呢?

假设你存在这样的记录:
卡号 余额 日期
1   100  2006-7-1
1   0    2006-7-3

你不加YE > 0,那么执行时得到的结果是第2条记录;
你加上YE > 0,那么执行时得到的结果是第1条记录;
当然是加上YE > 0得到的结果变大了。

理论上过滤掉YE=0的应该不影响统计结果(加0等于没加),并且只可能小

你的这种想法是错误的,你加上了YE > 0,并不是过滤掉YE = 0,而是替换,是使用YE > 0的值替换了原来的YE = 0的值。
  相关解决方案