Оператор SQL GROUP BY CASE с агрегатной функцией
У меня есть столбец, который выглядит примерно так:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
И я хотел бы поместить его в предложение GROUP BY, но это, похоже, вызывает проблемы, потому что в столбце есть агрегатная функция. Есть ли способ GROUP BY псевдонимом столбца, например some_product
в этом случае, или мне нужно поместить его в подзапрос и группу?
Ответы
Ответ 1
Я предполагаю, что вы действительно не хотите GROUP BY
some_product.
ответ на:. Есть ли способ 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 ...
Ответ 2
В то время как ответ Shannon технически корректен, он выглядит как излишний.
Простое решение состоит в том, что вам нужно поставить свое суммирование вне инструкции case
.
Это должно сделать трюк:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
В основном, ваш старый код сообщает SQL выполнить sum(X*Y)
для каждой строки отдельно (оставляя каждую строку со своим собственным ответом, который нельзя сгруппировать).
Кодовая строка, которую я написал, берет продукт суммы, который вы хотите.
Ответ 3
Если вы группируете другое значение, вместо того, что у вас есть,
напишите как
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Если, otoh, вы хотите group By
внутреннее выражение, (col3*col4)
, затем
напишите group By
в соответствии с выражением w/o 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