Ho una colonna che assomiglia a qualcosa del genere:
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 di aggregazione in colonna. C’è un modo per some_product
un alias di colonna come some_product
in questo caso, o devo metterlo in una sottoquery e raggruppare su quello?
La mia ipotesi è che tu non voglia veramente GROUP BY
some_product.
La risposta a: “C’è un modo per raggruppare un alias di colonna come some_product in questo caso, o devo metterlo in una sottoquery e raggruppare su quello?” è: non puoi GROUP BY
un alias di colonna.
La clausola SELECT
, in cui gli alias di colonna sono assegnati, non viene elaborata fino a dopo la clausola GROUP BY
. Una vista in linea o un’espressione di tabella comune (CTE) potrebbe essere utilizzata per rendere i risultati disponibili per il raggruppamento.
Vista in linea:
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 ...
Mentre la risposta di Shannon è tecnicamente corretta, sembra un eccesso.
La soluzione semplice è che è necessario inserire la sum al di fuori della dichiarazione del case
. Questo dovrebbe fare il trucco:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
In sostanza, il vecchio codice indica a SQL di eseguire la sum(X*Y)
per ogni riga singolarmente (lasciando ogni riga con la propria risposta che non può essere raggruppata).
La linea di codice che ho scritto prende la sum 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 group By
l’espressione interna, (col3*col4)
allora
scrivi il group By
per abbinare l’espressione senza la 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 si desidera raggruppare l’aggregato attuale
Select SumSomeProduct, Count(*), From (Select , Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct From Table Group By ) As Z Group by SumSomeProduct