Группируйте строки, исключая нулевые значения в определенном столбце и объединяя другие

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть такая таблица

CUSTOMER_ID ALIAS_ID ULTIMATE_NAME MODEL_SUB_TYPE OLD_PD OLD_EXP OLD_ECAP Оценка
Клиент A 123 Компания A CI_COM_KN 1 1 1 BB
Клиент A 123 Компания A CI_POL_KN 0.5 1 1 null
Клиент A 456 Компания B CI_COM_KN 1 1 3 BB
Клиент A 456 Компания B CI_POL_KN 0.5 1 3 null

Что мне нужно, чтобы мой запрос игнорировал значения в OLD_PD OLD_EXP RATING столбцах и когда MODEL_SUB_TYPE = Sub_type B и агрегировал (суммировал) 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 Оценка
Клиент A 123 Компания A CI_COM_KN 1 1 2 BB
Клиент A 456 Компания B CI_COM_KN 1 1 6 BB

Но на самом деле он возвращает таблицу, подобную первой, но с нулевыми значениями там, где она должна быть, но не группирует строки по идентификатору компании, например:

CUSTOMER_ID ALIAS_ID ULTIMATE_NAME MODEL_SUB_TYPE OLD_PD OLD_EXP OLD_ECAP Оценка
Клиент A 123 Компания A CI_COM_KN 1 1 1 BB
Клиент A 123 Компания A CI_POL_KN null null 1 null
Клиент A 456 Компания B CI_COM_KN 1 1 3 BB
Клиент A 456 Компания B CI_POL_KN null null 3 null

Комментарии:

1. Ваш запрос и данные образца не совпадают, и их нелегко сопоставить друг с другом. Пожалуйста, укажите точный запрос, который вы использовали для извлечения данных, показанных здесь в качестве образца данных

2. Извините за это. Просто обновил запрос, который я должен точно соответствовать приведенной выше таблице

Ответ №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)
 

Комментарии:

1. Это сработало! Я не знал, что могу использовать max и для струн. Большое спасибо!!