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?

È stato utile?

Soluzione

Suppongo che tu non voglia davvero GROUP BY some_product.

La risposta a: " Esiste un modo per Raggruppa per un alias di colonna come some_product in questo caso, o devo metterlo in una sottoquery e raggruppare su quello? " è: non puoi Raggruppa per un alias di colonna.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top