日期:2014-05-16  浏览次数:20948 次

想要边查询边汇总,不知道有没有可能
有一张订单表,数据示例如下:

唯一编号 产品 下单日期 付费日期 金额 当时是否付费
1 a 1 1 10 是
2 a 1   10 否
9 b 2 3 5 否
0 c 3 4 7 否
5 c 3 5 7 否
11 d 4   6 否
7 d 5 5 6 是
注:数据看起来比较乱,烦请各位转贴到excel 这样比较整齐好看


说明:唯一编号是一个无意义的数字,用序列生成的,作用只是唯一标识一条记录

我想达到下面的查询效果: 增加一列总未付费金锭,输出结果按下单日期和付费日期排序 (order by 下单日期, 付费日期)。  

不知道有没有可能使用sql完成。 麻烦各位指点一下,如果不行我再考虑使用存储过程。


唯一编号 产品 下单日期 付费日期 金额 当时是否付费 总未付费金额 说明
1 a 1 1 10 是 10 编号2未付费
2 a 1   10 否 10 编号2未付费
9 b 2 3 5 否 15 编号2、9未付费
0 c 3 4 7 否 24 编号2、0、5未付费
5 c 3 5 7 否 24 编号2、0、5未付费
11 d 4   6 否 23 编号2、5、11未付费
7 d 5 5 6 是 16 编号2、11未付费

注: 说明一列不是查询结果,只是我对查询结果的说明。可不理会。  


总付费金额的即是指在已下单但还没有付费的产品金额之和。

例如3号时,编号1、2、9、0、5 共五条记录需要统计(判断记录下单日期在3号或之前)
编号1、9是已付费的(因其付费日期是3号或之前),编号2、0、5是未付费的(因其付费日期要么是3号之后,要么是空)

所以,3号时未付费的金额是10 + 7 + 7 = 24
------解决方案--------------------
发帖的时候尽量把 创建表和插入测试数据的sql贴出来,这样才方便大家结贴。
------解决方案--------------------
几个子查询 条件写清楚就行了
------解决方案--------------------
试着写了个 看可以不.


with table1 as
(
     select 1 bh,'a' cp,1 xd,1 ff,10 je,'是' yn from dual union all
     select 2 bh,'a' cp,1 xd,null ff,10 je,'否' yn from dual union all
     select 9 bh,'b' cp,2 xd,3 ff,5 je,'否' yn from dual union all
     select 0 bh,'c' cp,3 xd,4 ff,7 je,'否' yn from dual union all
     select 5 bh,'c' cp,3 xd,5 ff,7 je,'否' yn from dual union all
     select 11 bh,'d' cp,4 xd,null ff,6 je,'否' yn from dual union all
     select 7 bh,'d' cp,5 xd,5 ff,6 je,'是' yn from dual 
)

select bh "唯一编号",cp "产品",xd "下单日期",
       ff "付费日期",je "金额",yn "当时是否付费",
       (select sum(je) 
       from table1 t1 
       where t1.xd <= t2.xd and (t1.ff > t2.xd or t1.ff is null)  and t1.yn = '否'
        ) "总未付费金额"
from table1 t2

   唯一编号 产品 下单日期 付费日期 金额 当时是否付费 总未付费金额
-----------------------------------------------------------------------------
1 1 a 1 1 10 是 10
2 2 a 1 10 否 10
3 9 b 2 3 5 否 15
4 0 c 3 4 7 否 24
5 5 c 3 5 7 否 24
6 11 d 4 6 否 23
7 7 d 5 5 6 是 16


------解决方案--------------------
sum(decode(当时是否付费,'是',金额,0)) over(partition by 产品 order by 下单日期) 
------解决方案--------------------
解决没?