SQL疑难案例之【结果列之间扣减】,该如何处理
SQL疑难案例之【结果列之间扣减】
各位好,现在遇到一个棘手的SQL查询结果列之间的问题,具体如下:
查询结果为五列,需要将 第五列(即下文的 总回款)从 倒数第四列开始 逐个列进行 扣减,直到将 最后一列减为0,将最后扣减的结果进行展示。
原始查询结果:
销售阶段一 销售阶段二 销售阶段三 销售阶段四 总回款
100 200 300 600 800
100 200 300 200 700
希望的结果:
销售阶段一 销售阶段二 销售阶段三 销售阶段四 总回款
100 200 100 0 0
100 0 0 0 0
得出结果的过程就是:用 【总回款】这一列 逐步的向 销售阶段四→销售阶段三→销售阶段二→销售阶段一,这样的顺序扣减,直至 总回款全部扣减为0
请问该如何实现?
------解决方案--------------------
各位好,现在遇到一个棘手的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