案例陈述对产出没有影响

时间:2016-08-23 21:39:08

标签: sql oracle case

我正在尝试根据银行审批状态获取捐款总额,并按礼品类别分组。但是,脚本在单独的行上输出RR和NR捐赠(参见下面的脚本)。似乎案例陈述根本不起作用。

txlotext.rep Report txlotext.rep

2 个答案:

答案 0 :(得分:3)

我相信你正在寻找这个逻辑:

select gift_kind,
       sum(case when c.bank_approval_status = 'AP' then c.charge_amount 
           end) as approved,  
       sum(case when c.bank_approval_status in ('RR', 'NR') then c.charge_amount
           end) as rejected,
       sum(case when c.bank_approval_status in ('AR') then c.charge_amount*-1
           end) as refunded,
       sum(case when c.bank_approval_status not in ('AR','AP','RR','NR') then c.charge_amount
           end) other_status
from charge_log c join
     transactions t
     on c.account_id = t.account_id and
        c.gift_date = t.gift_date and
        c.gift_seq = t.gift_seq and
        C.PLEDGE_NUMBER = t.pledge_number
where c.process_id = 'CHG - 02532' and t.sts = 'A'
group by t.fund_type, t.gift_kind
order by gift_kind asc

注意:

  • 学习使用正确的JOIN语法。 从不FROM子句中使用逗号。
  • JOIN条件应全部在ON子句中,而不是WHERE子句。
  • CASESUM()的参数。
  • bank_approval_status
  • 中删除GROUP BY
  • 我不知道为什么fund_type位于GROUP BY。你可能有理由这样我离开了。

答案 1 :(得分:0)

您需要将case子句放在总和中,然后添加else 0以确保您不会得到null

sum(case
    when c.bank_approval_status = 'AP' then 
        c.charge_amount else 0 end) approved,  
sum(case    
    when c.bank_approval_status in ('RR','NR') then 
        c.charge_amount else 0 end) rejected,
sum(case    
    when c.bank_approval_status = 'AR' then 
        -c.charge_amount else 0 end) refunded,
sum(case 
    when c.bank_approval_status not in ('AR','AP','RR','NR')  then 
        c.charge_amount else 0 end) other_status

您的group by应该很少出现在汇总中使用的列上(bank_approval_status中的sum)。改为:

group by  gift_kind

根据您的方案,可能需要将其他字段添加到group by子句中,但是将它们放在selectorder by子句中也是有意义的。