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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top