【问题标题】:Need to Sum the Values and then Minus Credit and Debit Note in Oracle需要对值求和,然后在 Oracle 中减去贷方和借方票据
【发布时间】:2014-11-03 14:50:36
【问题描述】:

嗨,请帮帮我,我需要在 Oracle 9i 中对值求和,然后减去贷方和借方票据

ID   Acc_TYP     Amt  


1     CR         100
2     CR         200
3     DB         50
4     DB         50   

使用上面的表结构,我需要通过(CR-DB)计算余额,如何形成逻辑
在 Single Query 中,请帮我解决问题,我是 oracle 的初学者。提前致谢

【问题讨论】:

  • 你试过为此写一个sql吗?这很容易。提示:使用 case when 构造。

标签: oracle oracle9i


【解决方案1】:
select sum(
         case 
            when acc_typ='CR' then amt
            when acc_typ='DB' then -amt
            else 0
         end) as balance
from the_table
where acc_typ in ('CR', 'DB');

【讨论】:

    【解决方案2】:

    你应该使用 CASE 语句:

    select sum(case when Acc_TYP='DB' 
                    then -amt 
                    else amt 
               end ) from t
    

    【讨论】:

      【解决方案3】:

      另一个基于案例的解决方案,使用“简单案例陈述”:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/controlstructures.htm#i8305

      select sum(case acc_type
                   when 'CR' then +amt
                   when 'DB' then -amt
                 end) balance
      from   ...
      

      【讨论】:

        【解决方案4】:

        试试这个:

        select sum(n) from (
        (select sum(amt) as n from table where acc_typ='CR') 
        union 
        (select -sum(amt) as n from table where acc_typ='DB')
        )
        

        【讨论】:

        • -1 表示效率低下,并且由于 UNION 中的隐含不同,当贷方总和等于减去借方总和时可能会出现错误答案。
        • @DavidAldridge 需要详细说明吗?如果贷方和借方的总和相等,此解决方案将如何返回错误的答案(只有当两个总和都返回 0 时才会发生 AFAICT,除非我们允许负数)?
        • 没有任何建议(在问题或会计原则中)禁止负金额。无论如何,如果贷方的 sum(amt) 为“10”,借方的 sum(amt) 为“-10”,那么借方的 -sum(amt) 将为“10”。添加这些应该给出“20”,但 UNION 将消除“10”之一,答案将是“10”而不是正确的“20”。 sqlfiddle.com/#!4/72810/11
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多