案例陈述对输出没有影响

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 子句中。 CASESUM() 的参数。 从GROUP BY 中删除bank_approval_status。 我不知道为什么fund_typeGROUP 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_statussum 中)。改为:

group by  gift_kind

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

【讨论】:

并且还要修复 GROUP BY 感谢您强调这一点,@MatBailie 感谢您的评论!但是,我在您的脚本中进行了替换,但仍然将 RR 和 NR 捐款分开而不是加在一起。关于为什么会这样的任何想法? 是您的group by 使它们分开,请参阅我的回答的最后编辑。

以上是关于案例陈述对输出没有影响的主要内容,如果未能解决你的问题,请参考以下文章

直播案例剖析:手机降频对直播声音体验的影响

彩色线阵CCD的输出是数字还是模拟的?三原色是并行输出吗?不同的频率和光强对输出各有啥影响?

Log4J对系统性能的影响

CC2530的通用IO端口(GPIO)输入和输出控制

减少回归模型中一个变量对输出的影响

java读取文件内容并输出,实战案例