Оператор SQL GROUP BY CASE с агрегатной функцией
-
05-07-2019 - |
Вопрос
У меня есть колонка, которая выглядит примерно так:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
И я хотел бы поместить это в мое предложение GROUP BY, но это, похоже, вызывает проблемы, потому что в column есть агрегатная функция.Есть ли способ СГРУППИРОВАТЬ По псевдониму столбца, например some_product
в этом случае, или мне нужно поместить это в подзапрос и сгруппировать по нему?
Решение
Я предполагаю, что на самом деле ты этого не хочешь GROUP BY
какой-нибудь продукт.
Тот Самый ответ на: "Есть ли способ GROUP BY
псевдоним столбца, такой как some_product в данном случае, или мне нужно поместить это в подзапрос и сгруппировать по нему?" является: Ты не можешь GROUP BY
псевдоним столбца.
Тот Самый SELECT
предложение, в котором присваиваются псевдонимы столбцов, обрабатывается только после завершения GROUP BY
оговорка.Встроенное представление или общее табличное выражение (CTE) можно использовать, чтобы сделать результаты доступными для группировки.
Встроенный просмотр:
select ...
from (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
from ...
group by col1, col2 ... ) T
group by some_product ...
CTE:
with T as (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
from ...
group by col1, col2 ... )
select ...
from T
group by some_product ...
Другие советы
Хотя ответ Шеннона технически верен, он выглядит излишним.
Простое решение заключается в том, что вам нужно поместить суммирование вне оператора case
.
Это должно сработать:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
По сути, ваш старый код указывает SQL на выполнение sum (X * Y)
для каждой строки отдельно (оставляя каждую строку со своим собственным ответом, который нельзя сгруппировать).
В строке кода, которую я написал, берется сумма, которая вам нужна. Р>
Если вы группируете по другому значению, то вместо того, что у вас есть,
напишите как
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Если, ооо, вы хотите сгруппировать по
внутреннему выражению, (col3 * col4)
then
напишите group By
, чтобы соответствовать выражению без SUM
...
Select Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct
From ...
Group By Case When col1 > col2 Then col3*col4 Else 0 End
Наконец, если вы хотите сгруппировать по фактическому агрегату
Select SumSomeProduct, Count(*), <other aggregate functions>
From (Select <other columns you are grouping By>,
Sum(Case When col1 > col2
Then col3*col4 Else 0 End) as SumSomeProduct
From Table
Group By <Other Columns> ) As Z
Group by SumSomeProduct