案例陈述对输出没有影响
Posted
技术标签:
【中文标题】案例陈述对输出没有影响【英文标题】:Case Statement having no effect on output 【发布时间】:2016-08-23 21:39:07 【问题描述】:我正在尝试根据银行批准状态并按礼物种类分组来获取捐款金额。但是,脚本在不同的行上输出 RR 和 NR 捐赠(见脚本下方)。案例陈述似乎根本不起作用。
select gift_kind,
case
when c.bank_approval_status = 'AP' then
sum(c.charge_amount) end approved,
case
when c.bank_approval_status in ('RR','NR') then
sum(c.charge_amount) end rejected,
case
when c.bank_approval_status = 'AR' then
sum(c.charge_amount)*-1 end refunded,
case
when c.bank_approval_status not in ('AR','AP','RR','NR') then
sum(c.charge_amount) end other_status
from charge_log c, transactions t
where c.account_id=t.account_id
and c.process_id= 'CHG - 02532'
and c.gift_date=t.gift_date
and c.gift_seq=t.gift_seq
and C.PLEDGE_NUMBER=t.pledge_number
and t.sts='A'
group by t.fund_type, t.gift_kind, c.bank_approval_status
order by gift_kind asc
【问题讨论】:
把case
放在sum()
函数里面,例如:sum(case when c.bank_approval_status = 'AP' then c.charge_amount end)
...并在最后一个子句中使用else
。
【参考方案1】:
我相信你正在寻找这个逻辑:
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
子句中。
CASE
是SUM()
的参数。
从GROUP BY
中删除bank_approval_status
。
我不知道为什么fund_type
在GROUP BY
中。你可能有原因,所以我离开了。
【讨论】:
非常感谢,戈登,这正是我需要的。我也一定会把这些笔记牢记在心——我正在这里的工作中学习,非常感谢您的反馈。【参考方案2】:您需要将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
子句中,但也可以将它们放在 select
和 order by
子句中。
【讨论】:
并且还要修复 GROUP BY 感谢您强调这一点,@MatBailie 感谢您的评论!但是,我在您的脚本中进行了替换,但仍然将 RR 和 NR 捐款分开而不是加在一起。关于为什么会这样的任何想法? 是您的group by
使它们分开,请参阅我的回答的最后编辑。以上是关于案例陈述对输出没有影响的主要内容,如果未能解决你的问题,请参考以下文章