Solución:
Mi conjetura es que realmente no quieres GROUP BY
algún_producto.
los Respuesta para: “¿Hay alguna manera de GROUP BY
un alias de columna como some_product en este caso, o necesito poner esto en una subconsulta y agrupar en eso? ” es: No se puede GROUP BY
un alias de columna.
los SELECT
cláusula, donde se asignan alias de columna, no se procesa hasta después de la GROUP BY
cláusula. Se puede utilizar una vista en línea o una expresión de tabla común (CTE) para que los resultados estén disponibles para la agrupación.
Vista en línea:
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 ...
Si bien la respuesta de Shannon es técnicamente correcta, parece exagerada.
La solución simple es que necesita poner su suma fuera del case
declaración. Esto debería funcionar:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
Básicamente, su código antiguo le dice a SQL que ejecute el sum(X*Y)
para cada línea individualmente (dejando cada línea con su propia respuesta que no se puede agrupar).
La línea de código que he escrito toma el producto de suma, que es lo que desea.
Si está agrupando por algún otro valor, entonces en lugar de lo que tiene,
escríbelo como
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Si, otoh, quieres group By
la expresión interna, (col3*col4)
luego
escribe el group By
para que coincida con la expresión sin el 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, si desea agrupar por el 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