【问题标题】:Group rows while excluding null values on specific column and aggregating another对行进行分组,同时排除特定列上的空值并聚合另一个
【发布时间】:2021-02-01 10:46:59
【问题描述】:

我有一张这样的桌子

CUSTOMER_ID ALIAS_ID ULTIMATE_NAME MODEL_SUB_TYPE OLD_PD OLD_EXP OLD_ECAP RATING
Client A 123 Company A CI_COM_KN 1 1 1 BB+
Client A 123 Company A CI_POL_KN 0.5 1 1 null
Client A 456 Company B CI_COM_KN 1 1 3 BB+
Client A 456 Company B CI_POL_KN 0.5 1 3 null

我需要我的查询做的是在MODEL_SUB_TYPE = Sub_type B 时忽略OLD_PDOLD_EXPRATING 列中的值,并聚合(求和)OLD_ECAP 列而不考虑MODEL_SUB_TYPE

到目前为止,我所拥有的是:

SELECT
    CUSTOMER_ID,
    ALIAS_ID,
    SUBSTR(ULTIMATE_NAME, 0, 70) as ULTIMATE_NAME,
    MODEL_SUB_TYPE,
    CASE
        WHEN MODEL_SUB_TYPE LIKE 'CI_COM_%' THEN ULTIMATE_POD
    END AS OLD_PD,
    SUM(
        CASE
            WHEN MODEL_SUB_TYPE LIKE 'CI_COM_%' THEN CREDIT_LIMIT_NET_EXPOSURE
        END
    ) AS OLD_EXP,
    SUM(EC_CONSUMPTION_ND) AS OLD_ECAP,
    ULTIMATE_RATING AS RATING
FROM
    CALC6619.SO_REPORTING -- OLD QUARTER --
WHERE
    MODEL_TYPE LIKE 'IR'
    AND MODEL_SUB_TYPE LIKE 'CI_%'
    AND CUSTOMER_ID = '09781C1 01' -- Customer ID
GROUP BY
    CUSTOMER_ID,
    ALIAS_ID,
    ULTIMATE_NAME,
    MODEL_SUB_TYPE,
    ULTIMATE_POD,
    ULTIMATE_RATING

想要是我的查询返回这样的表(基于上面的表):

CUSTOMER_ID ALIAS_ID ULTIMATE_NAME MODEL_SUB_TYPE OLD_PD OLD_EXP OLD_ECAP RATING
Client A 123 Company A CI_COM_KN 1 1 2 BB+
Client A 456 Company B CI_COM_KN 1 1 6 BB+

但它实际上返回了一个类似于第一个表的表,但它应该是空值,但没有按公司 ID 对行进行分组,如下所示:

CUSTOMER_ID ALIAS_ID ULTIMATE_NAME MODEL_SUB_TYPE OLD_PD OLD_EXP OLD_ECAP RATING
Client A 123 Company A CI_COM_KN 1 1 1 BB+
Client A 123 Company A CI_POL_KN null null 1 null
Client A 456 Company B CI_COM_KN 1 1 3 BB+
Client A 456 Company B CI_POL_KN null null 3 null

【问题讨论】:

  • 您的查询和样本数据不匹配,不容易相互映射。请提供您用于获取此处显示的数据作为示例数据的确切查询
  • 很抱歉。刚刚更新了查询,我必须完全匹配上面的表格

标签: sql oracle


【解决方案1】:

您只需从group by 中删除列并在SELECT 子句中进行一些更改,如下所示:

SELECT
    CUSTOMER_ID,
    ALIAS_ID,
    SUBSTR(ULTIMATE_NAME, 0, 70) as ULTIMATE_NAME,
    MAX(CASE WHEN MODEL_SUB_TYPE LIKE 'CI_COM_%' THEN MODEL_SUB_TYPE END) AS MODEL_SUB_TYPE,
    SUM(CASE
        WHEN MODEL_SUB_TYPE LIKE 'CI_COM_%' THEN ULTIMATE_POD
    END) AS OLD_PD,
    SUM(
        CASE
            WHEN MODEL_SUB_TYPE LIKE 'CI_COM_%' THEN CREDIT_LIMIT_NET_EXPOSURE
        END
    ) AS OLD_EXP,
    SUM(EC_CONSUMPTION_ND) AS OLD_ECAP,
    MAX(ULTIMATE_RATING) AS RATING
FROM
    CALC6619.SO_REPORTING -- OLD QUARTER --
WHERE
    MODEL_TYPE LIKE 'IR'
    AND MODEL_SUB_TYPE LIKE 'CI_%'
    AND CUSTOMER_ID = '09781C1 01' -- Customer ID
GROUP BY
    CUSTOMER_ID,
    ALIAS_ID,
    SUBSTR(ULTIMATE_NAME, 0, 70)

【讨论】:

  • 成功了!我不知道我也可以将 max 用于字符串。非常感谢!!
猜你喜欢
  • 2022-01-12
  • 2021-01-31
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2020-12-21
  • 2022-07-01
  • 2020-05-17
相关资源
最近更新 更多