2011-07-05 16 views
6

Quiero consultar una tabla de pedidos y mostrar el ID del cliente y el total de todos sus pedidos, sin embargo, los pedidos pueden tener totales positivos o negativos.Consulta de agregación SQL para SUM, pero solo permite sumas positivas (de lo contrario 0)

select customer_id, SUM(order_total) from orders group by customer_id; 

Ahora mi pregunta - ¿cómo puedo lograr lo siguiente en una consulta SQL:

Si la suma total es positivo, quiero mostrarlo como es; si la suma total es negativa, solo quiero mostrar 0 en lugar de la cantidad real.

Lo que estoy buscando es una función que puede manejar esto, similar a la función IFNULL (IFNULL(SUM(order_total),0)), pero en lugar de la comprobación de nulo, se debe comprobar si hay un resultado negativo.

pseudo código:

IFNEGATIVE(SUM(order_total),0) 

¿Hay una manera simple en SQL estándar (o específicamente en MySQL 5.5, también estaría bien).

Respuesta

10
SELECT customer_id, 
    CASE 
    WHEN SUM(order_total) < 0 THEN 0 
    ELSE SUM(order_total) 
    END 
    FROM orders 
    GROUP BY customer_id; 

Revise su plan de ejecución, pero los 2 SUM s probablemente serán optimizados para un solo SUM debajo del capó.

+0

Muchas gracias, no he usado casos en sql a menudo, es bueno saber :) Creo que algunas de las otras respuestas proporcionadas (es decir, SI también funcionan), sin embargo, deja Yo acepto esta votación aquí, también voté los otros. –

1

si entiendo su único envolverlo con MAYOR

SELECT customer_id, GREATEST(0,SUM(order_total)) 
FROM orders GROUP BY customer_id; 

mirada en la link

+0

Esto sumará solo pedidos positivos. El OP solicita la suma de todos los pedidos. –

+0

actualizo mi respuesta, ahora entiendo lo que necesita –

1

¿No podría usar una instrucción CASE?

Algo así como:

CASE WHEN [Field] < 0 THEN 0 

O me he perdido algo?

+0

te perdiste algo.es la * suma * que no debería ser negativa - las filas individuales se pueden mezclar + ve y -ve siempre que la suma no sea negativa – Bohemian

+0

¡casi se sintió demasiado simple! Gracias. – CatchingMonkey

3
No

probado, pero algo como esto debería hacerlo:

SELECT customer_id , IF(SUM(order_total) > 0, SUM(order_total), 0) AS sum FROM orders GROUP BY customer_id 
-2

para mostrar únicamente el uso positivo teniendo así:

select customer_id, SUM(order_total) from orders group by customer_id HAVING SUM(order_total) > 0; 

utilizan de alguna manera el caso que se enumeran en otros lugares aquí

+0

Eso limitará su búsqueda, pero no mostrará 0 cuando la suma sea negativa. – Vache

+0

Realicé mal entendido el 'cero pantalla' pero dejé la respuesta aquí para otros casos ... –

8

Pruebe con :

select customer_id, GREATEST(SUM(order_total),0) from orders group by customer_id; 
+1

+1 me gusta - solo hace la suma una vez – Bohemian

+1

Me gusta más esto también para la legibilidad/mantenibilidad, pero es una verificación rápida de Mi final para un escenario similar muestra el mismo plan de ejecución en SQL 2012: el servidor SQL puede darse cuenta de que realmente solo lo necesita una vez. –

+1

Y me doy cuenta de que esta es una vieja pregunta y acabo de ver que en realidad es para MySQL, pero esto parece una optimización muy baja, apostaría a que MySQL podría hacerlo también. –

0
select Id,case when (sum(amount)<0) then 0 else sum(amount) end from tblsum group by Id 
0

También puede probar;

select 
    (sum(fld) + abs(sum(fld)))/2 
from tbl 
+0

no debería ser (suma (fld) + suma (abs ((fld)))/2 –

Cuestiones relacionadas