#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 и для струн. Большое спасибо!!