2009-05-04 10 views
8

Disons que j'ai une table:SQL Sélection de plusieurs sommes?

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

Cette retourne une liste de produits avec la quantité vendue depuis une date donnée. Y at-il un moyen de sélectionner non seulement cette somme, mais aussi la somme SANS la condition où? J'aimerais voir des ventes depuis une date particulière pour chaque produit, à côté de toutes les ventes (et non limitées à une date).

Répondre

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

devrait être beaucoup plus rapide qu'une sous requête :) corrélative –

+1

aurait upvote cette 20 fois si je pouvais. juste refacturé ma requête par votre exemple et gagné environ cinq fois plus de performance par rapport à ma précédente solution = D thx! –

0

vous pouvez écrire

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

quelque chose comme ça ?:

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 vous voulez voir les ventes totales à côté, alors vous utilisez somme (sale_amt), et dans le groupe par ajouter le sale_amt. J'espère que ça aide.

0

Vous pouvez utiliser GROUP BY pour diviser les ventes en fonction de la date. Dans Oracle, vous pouvez dire:

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; 
Questions connexes