2009-05-04 4 views
8

Diciamo che ho una tabella:SQL Selezione di più somme?

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

Questo restituisce un elenco di prodotti con la quantità venduta in quanto una data particolare. C'è un modo per selezionare non solo questa somma, ma ANCHE la somma SENZA la condizione dove? Mi piacerebbe vedere le vendite da una data specifica per ogni prodotto a fianco di tutte le vendite (non a date limitate).

risposta

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

dovrebbe essere molto più veloce di una query sub correlato :) –

+1

sarebbe upvote questo 20 volte se potessi. ho semplicemente rifattorato la mia domanda con il tuo esempio e guadagnato circa un incremento di cinque volte delle prestazioni rispetto alla mia soluzione precedente = D thx! –

0

è possibile scrivere

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

qualcosa di simile ?:

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

Se volete vedere le vendite totali a fianco, quindi si può usare sum (sale_amt), e nel raggruppa aggiungendo il sale_amt. Spero possa essere d'aiuto.

0

È possibile utilizzare GROUP BY per suddividere le vendite in base alla data. In Oracle si potrebbe 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;