Istruzione GROUP BY CASE SQL con funzione aggregata
-
05-07-2019 - |
Domanda
Ho una colonna che assomiglia a questa:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
E vorrei metterlo nella mia clausola GROUP BY, ma questo sembra causare problemi perché c'è una funzione aggregata nella colonna. Esiste un modo per raggruppare un alias di colonna come some_product
in questo caso, o devo inserirlo in una sottoquery e raggruppare su quello?
Soluzione
Suppongo che tu non voglia davvero GROUP BY
some_product.
La risposta a: " Esiste un modo per
La clausola SELECT
, in cui sono assegnati gli alias di colonna, non viene elaborata fino a dopo la clausola GROUP BY
. Una vista incorporata o un'espressione di tabella comune (CTE) potrebbe essere utilizzata per rendere i risultati disponibili per il raggruppamento.
Vista incorporata:
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 ...
Altri suggerimenti
Sebbene la risposta di Shannon è tecnicamente corretta, sembra eccessiva.
La soluzione semplice è che devi mettere la tua somma fuori dall'istruzione case
.
Questo dovrebbe fare il trucco:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
Fondamentalmente, il tuo vecchio codice dice a SQL di eseguire la sum (X * Y)
per ogni riga individualmente (lasciando ogni riga con la propria risposta che non può essere raggruppata).
La riga di codice che ho scritto prende la somma del prodotto, che è quello che vuoi.
Se stai raggruppando per qualche altro valore, allora invece di quello che hai,
scrivilo come
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Se, otoh, vuoi raggruppare per
l'espressione interna, (col3 * col4)
quindi
scrivi il gruppo Per
in modo che corrisponda all'espressione senza 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
Infine, se vuoi raggruppare per aggregato effettivo
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