Istruzione SQL GROUP BY CASE con funzione di aggregazione

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