【问题标题】:Sum case statement in oracle SQL Group By Case description remove nullsoracle SQL Group By Case描述中的Sum case语句删除空值
【发布时间】:2021-08-25 19:59:29
【问题描述】:
account DR_DESCRIPTION CR_DESCRIPTION DR_AMOUNT CR_AMOUNT
xxx-111-xxx land 60
xxx-111-xxx cash 21300
xxx-111-xxx capital 1789
xxx-111-xxx diesel 480
xxx-111-xxx gas 19687
xxx-111-xxx food 1193
xxx-111-xxx water 1789
xxx-111-xxx electricity 0

我有以下查询结果集

但是,我想做的是删除空值并使结果如下所示:

account DR_DESCRIPTION CR_DESCRIPTION DR_AMOUNT CR_AMOUNT
xxx-111-xxx land diesel 60 480
xxx-111-xxx cash gas 21300 19687
xxx-111-xxx capital food 1789 1193
xxx-111-xxx water 1789
xxx-111-xxx electricity 0

我使用的查询是:

SELECT account,
    CASE WHEN debit_credit  = 'DR' THEN DESCRIPTION END dr_description,
    CASE WHEN debit_credit  = 'CR' THEN DESCRIPTION END cr_description,
    SUM(CASE WHEN debit_credit = 'DR' THEN income_amount END) DR_AMOUNT,
    SUM(CASE WHEN debit_credit = 'CR' THEN income_amount END) CR_amount
FROM xxxxx
GROUP BY account, CASE WHEN debit_credit = 'DR' THEN DESCRIPTION END, 
    CASE WHEN debit_credit  = 'CR' THEN DESCRIPTION END

【问题讨论】:

  • 没有迹象表明土地/柴油、现金/天然气或资本/食物应该捆绑在一起。如果您可以分享您正在使用的 xxxxx 表中的一些示例源数据,那么可能会有所帮助。
  • 嗨,让我马上为你得到那个@EJEgyed
  • @EJEgyed 我已经添加了上面的原始数据
  • 原始数据仍然没有显示借方和贷方之间的任何关系。你怎么知道“land DR”应该和“diesel CR”在同一行?为什么“陆地DR”和“水CR”不能在同一行?
  • 我知道没有关系,但数据的呈现要求它并排。我只想获得有关策略的指导,我可以用它来并排@EJEgyed

标签: sql oracle oracle11g oracle-apex oracle18c


【解决方案1】:

我认为您只需要修复当前的查询:

select account,
       max(case when debit_credit = 'DR' then DESCRIPTION end) as dr_description,
       max(case when debit_credit = 'CR' then DESCRIPTION end) as cr_description,
       sum(case when debit_credit = 'DR' then income_amount end) as DR_AMOUNT,                                                 
       sum(case when debit_credit = 'CR' then income_amount end) as CR_amount
from  xxxxx
group by account;

上面每个帐户返回一行。如果您想要单独使用每个借记卡和贷记卡,那么您将使用row_number()。假设您有一个指定排序的列:

select account,
       max(case when debit_credit = 'DR' then DESCRIPTION end) as dr_description,
       max(case when debit_credit = 'CR' then DESCRIPTION end) as cr_description,
       sum(case when debit_credit = 'DR' then income_amount end) as DR_AMOUNT,                                                 
       sum(case when debit_credit = 'CR' then income_amount end) as CR_amount
from (select x.*,
             row_number() over (partition by account, debit_credit order by <ordering column>) as seqnum
      from xxxxx x
     ) x
group by account, seqnum;

【讨论】:

    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 2020-10-26
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多