2009-05-04 12 views
8

Digamos que tengo una tabla:SQL ¿Seleccionar varias sumas?

SELECT SUM(quantity) AS items_sold_since_date, 
     product_ID 
FROM Sales 
WHERE order_date >= '01/01/09' 
GROUP BY product_ID 

Esto devuelve una lista de productos con la cantidad vendida desde una fecha determinada. ¿Hay alguna manera de seleccionar no solo esta suma, sino TAMBIÉN la suma SIN la condición de dónde? Me gustaría ver las ventas desde una fecha determinada para cada producto junto con todas las ventas (sin fecha limitada).

Respuesta

21
SELECT SUM(CASE WHEN order_date >= '01/01/09' THEN quantity ELSE 0 END) AS items_sold_since_date, 
     SUM(quantity) AS items_sold_total, 
     product_ID 
FROM Sales 
GROUP BY product_ID 
+0

debería ser mucho más rápido que una consulta sub correlacionada :) –

+1

habría upvote esto 20 veces si pudiera. Acabo de refactorizar mi consulta con su ejemplo y obtuve un aumento de cinco veces en el rendimiento en comparación con mi solución anterior = D thx! –

0

puede escribir

SELECT SUM(quantity) AS items_sold_since_date,(SELECT SUM(quantity) AS items_sold_since_date FROM Sales 
GROUP BY product_ID) as items_sold, 
     product_ID 
FROM Sales 
WHERE order_date >= '01/01/09' 
GROUP BY product_ID 
0

algo como esto ?:

SELECT SUM(quantity) AS items_sold_since_date, 
     total_items_sold = (SELECT SUM(quantity) from Sales GROUP BY product_ID), 
     product_ID 
FROM Sales 
WHERE order_date >= '01/01/09' 
GROUP BY product_ID 
0

Si te gusta ver a las ventas totales al lado, entonces se usarían suma (sale_amt), y en el agrupar por agregar el sale_amt. Espero que ayude.

0

Puede usar GROUP BY para dividir las Ventas en función de la fecha. En Oracle se podría decir:

select count(*) 
     ,case when order_date >= '01/01/09' then 'after' else 'before' end 
from log 
group by case when order_date >= '01/01/09' then 'after' else 'before' end;