Подтвердить что ты не робот

Оператор SQL GROUP BY CASE с агрегатной функцией

У меня есть столбец, который выглядит примерно так:

CASE
    WHEN col1 > col2 THEN SUM(col3*col4)
    ELSE 0
END AS some_product

И я хотел бы поместить его в предложение GROUP BY, но это, похоже, вызывает проблемы, потому что в столбце есть агрегатная функция. Есть ли способ GROUP BY псевдонимом столбца, например some_product в этом случае, или мне нужно поместить его в подзапрос и группу?

4b9b3361

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