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

SQL疑难案例之【结果列之间扣减】
各位好,现在遇到一个棘手的SQL查询结果列之间的问题,具体如下:
查询结果为五列,需要将 第五列(即下文的 总回款)从 倒数第四列开始 逐个列进行 扣减,直到将 最后一列减为0,将最后扣减的结果进行展示。

原始查询结果:
销售阶段一    销售阶段二   销售阶段三    销售阶段四    总回款
  100 200 300       600           800
  100 200 300   200           700
  
 希望的结果:
 销售阶段一    销售阶段二   销售阶段三    销售阶段四    总回款
  100 200 100     0            0
  100 0 0     0            0

得出结果的过程就是:用 【总回款】这一列 逐步的向 销售阶段四→销售阶段三→销售阶段二→销售阶段一,这样的顺序扣减,直至 总回款全部扣减为0

请问该如何实现?
------解决方案--------------------

with t1 as
(
     select 100 c1,200 c2,300 c3,600 c4,800 c5 from dual
     union all
     select 100 c1,200 c2,300 c3,200 c4,700 c5 from dual
)


select case when c5-c4-c3-c2 <= 0 then c1 else decode(sign(c1+c2+c3+c4-c5),1,c1+c2+c3+c4-c5,0) end c1,
       case when c5-c4-c3 <= 0 then c2 else decode(sign(c2+c3+c4-c5),1,c2+c3+c4-c5,0) end c2,
       case when c5-c4 <= 0 then c3 else decode(sign(c3+c4-c5),1,c3+c4-c5,0) end c3,
       case when c5-c4 <= 0 then c4 else decode(sign(c4-c5),1,c4-c5,0) end c4,
       case when c5-c4-c3-c2-c1 <= 0 then 0 else decode(sign(c5-c4-c3-c2-c1),1,c5-c4-c3-c2-c1,0) end c5
from t1


     c1     c2     c3     c4     c5
-----------------------------------------------
1 100 200 100 0 0
2 100 0 0 0 0