Saltar al contenido

Instrucción SQL GROUP BY CASE con función agregada

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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *