Declaração do grupo SQL por caso com função agregada
-
05-07-2019 - |
Pergunta
Eu tenho uma coluna que se parece mais disso:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
E eu gostaria de colocá -lo no meu grupo por cláusula, mas isso parece causar problemas porque há uma função agregada na coluna. Existe uma maneira de agrupar um alias de coluna como some_product
Nesse caso, ou preciso colocar isso em uma subconsulta e um grupo nisso?
Solução
Meu palpite é que você realmente não quer GROUP BY
Alguns_product.
o responda para: "Existe uma maneira de GROUP BY
Um pseudônimo de coluna, como algum_produto neste caso, ou preciso colocar isso em uma subconsulta e um grupo nisso? " é: Você não pode GROUP BY
um alias de coluna.
o SELECT
a cláusula, onde os aliases da coluna são atribuídos, não é processado até depois do GROUP BY
cláusula. Uma visão em linha ou expressão de tabela comum (CTE) pode ser usada para disponibilizar os resultados para agrupamento.
Visualização embutida:
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 ...
Outras dicas
Enquanto Resposta de Shannon é tecnicamente correto, parece um exagero.
A solução simples é que você precisa colocar seu resumo fora do case
declaração. Isso deve fazer o truque:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
Basicamente, seu código antigo diz ao SQL para executar o sum(X*Y)
Para cada linha individualmente (deixando cada linha com sua própria resposta que não pode ser agrupada).
A linha de código que escrevi leva o produto da soma, que é o que você deseja.
Se você está agrupando por algum outro valor, então, em vez do que você tem,
Escreva como
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Se, otoh, você quer group By
a expressão interna, (col3*col4)
então
escreva o group By
Para corresponder à expressão com o 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
Finalmente, se você deseja agrupar pelo agregado real
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