CASE Statement - Одно и то же условие применяется к нескольким случаям - PullRequest
1 голос
/ 05 апреля 2020
Query:

    SELECT 
    CASE 
        WHEN app_id IN ('ICTO-115') THEN 'CASH_EQUITY' 
        WHEN app_id IN ('ICTO-115') THEN 'FX'
    END AS PRODUCT_LINE,
    sum(breaches) AS TOTAL
FROM metrics_daily M
WHERE app_id IN ('ICTO-115')
GROUP BY
    CASE 

        WHEN app_id IN ('ICTO-115') THEN 'CASH_EQUITY' 
        WHEN app_id IN ('ICTO-115') THEN 'FX'
    END;

Table

app_id      breaches
ICTO-115    26
ICTO-120    14
ICTO-569    45
ICTO-256    24

У меня есть заявление о том, что app_id ICTO-115 применяется более чем к одному продукту, но сумма 26 (количество нарушений) отображается только для CASH_EQUITY как часть GROUP BY. Таким образом, результат как часть моего запроса:

Product         TOTAL
CASH_EQUITY     26

Мой желаемый результат будет:

Product         TOTAL
CASH_EQUITY     26
FX              26

Что я могу сделать, чтобы FX также отображался с total как 26. ICTO-115 относится как к FX, так и к CASH_EQUITY. У меня есть еще app_ids, где применяется этот сценарий, но я попытался привести очень простой пример.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Вы можете начать с подзапроса, который сопоставляет app_ids с линиями продуктов, и объединить его с таблицей:

select m.product_line, sum(breaches) total
from (
    select 'ICTO-115' app_id, 'CASH_EQUITY' product_line from dual
    union all
    select 'ICTO-115', 'FW' from dual
) p
inner join metrics_daily m on m.app_id = p.app_id
group by m.product_line

Если у вас большое количество сопоставлений идентификаторов приложений / линий продуктов, оно было бы проще поместить их в таблицу, с каждым кортежем в отдельной строке. Затем вы можете просто заменить производную таблицу (подзапрос) этой таблицей сопоставления.

Сказать таблицу app_to_product:

app_id    | product_line
--------- | ------------
ICTO-115  | CASH_EQUITY
ICTO-115  | FW

Теперь запрос можно записать в виде:

select m.product_line, sum(breaches) total
from app_to_product p
inner join metrics_daily m on m.app_id = p.app_id
group by m.product_line
0 голосов
/ 05 апреля 2020

Я бы предложил поместить значения в отдельные столбцы , а не строки :

SELECT (CASE WHEN app_id IN ('ICTO-115') THEN breaches END) as CASH_EQUITY,
       (CASE WHEN app_id IN ('ICTO-115') THEN breaches END) as FX
FROM metrics_daily M
WHERE app_id IN ('ICTO-115')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...