首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

SQL疑难案例之【结果列之间扣减】,该如何处理

2013-01-25 
SQL疑难案例之【结果列之间扣减】各位好,现在遇到一个棘手的SQL查询结果列之间的问题,具体如下:查询结果为五

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

原始查询结果:
销售阶段一    销售阶段二   销售阶段三    销售阶段四    总回款
  100200300       600           800
  100200300  200           700
  
 希望的结果:
 销售阶段一    销售阶段二   销售阶段三    销售阶段四    总回款
  100200100    0            0
  10000    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
-----------------------------------------------
110020010000
21000000

热点排行
Bad Request.