如何在同一张表中获得差额?

时间:2015-02-03 07:08:03

标签: sql oracle10g

我在撰写oracle查询时需要帮助 我有一个如附图所示的数据。

在图片中我有3列,如sernoaccorderbalance

我想得到另一个名为差异的列,其中派生是前两行余额之和 - 接下来的两行平衡总和,就像我需要获得差异的所有行一样。

例如,如图所示,差异应计算为前两行平衡数据的差异 - 接下来两行的余额数据,即(43801 + 43801) - (103397.25 + 103397.25)

Image with data

2 个答案:

答案 0 :(得分:0)

您可以尝试使用案例陈述,如下所示

Select serNo,
    ( SUM(CASE accorder_
        when  1 then balance
        else 0 end)
      - SUM(case.accorder_
        when 2 then balance
        else 0 end)) as finalAmount
    from table name
    group by serNo

答案 1 :(得分:0)

您可以使用analytic lead() function查看相关行并计算差异;假设您只希望在同一serno和' next'之间的行之间存在差异。行由accorder

定义
select serno, accorder, balance,
  balance - lead(balance, 2)
    over (partition by serno order by accorder) as diff
from t42
order by serno, accorder;

     SERNO   ACCORDER    BALANCE       DIFF
---------- ---------- ---------- ----------
         1          1      43801  -59596.25 
         1          1      43801  -59596.25 
         1          2  103397.25            
         1          2  103397.25            
         2          1 73058737.2            
         2          1 73058737.2            
         3          1   30711.94            
         3          1   30711.94            
         4          1  436414.01            
         4          1  436414.01            

为什么您的行似乎重复,这一点并不明显。如果您希望两个值都具有总差异,因为问题中的计算显示为(43801 + 43801) - (103397.25+103397.25) - 那么您只需将计算出的差异加倍:

  2 * (balance - lead(balance, 2)
    over (partition by serno order by accorder)) as diff

     SERNO   ACCORDER    BALANCE       DIFF
---------- ---------- ---------- ----------
         1          1      43801  -119192.5 
         1          1      43801  -119192.5 
         1          2  103397.25            
...

如果每对行中的余额可能不同 - 所以它们不一定重复 - 那么它会有点复杂,但似乎并非如此。