有一张订单表,数据示例如下:唯一编号 产品 下单日期 付费日期 金额 当时是否付费
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

解决方案 »

  1.   

    发帖的时候尽量把 创建表和插入测试数据的sql贴出来,这样才方便大家结贴。
      

  2.   

    试着写了个 看可以不.
    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
      

  3.   

    sum(decode(当时是否付费,'是',金额,0)) over(partition by 产品 order by 下单日期) 
      

  4.   


    我一开始也考虑用sum over但是发现一个麻烦点,就是怎么判断未付费的金额(主要原因是当时是否付费这个字段,只是代表下单日期的情况,不代表在之后的情况,例如3号下单,4号付费,记录会登记当时未付费,但到了4号,这笔记录其实已经付费了)
    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 = '否'
            ) "总未付费金额", sum(decode(yn,'是',je,0)) over(partition by cp order by xd)  "forgetsam的结果"
    from table1 t2
      

  5.   


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

  6.   

    你要把所有cp混在一起算,那就去掉partition by