Вопрос

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top