2016-11-11 89 views
1

希望有人可以幫助我處理此查詢。SQL:使用子查詢對數據進行分組

如果我有一個示例表:

orderId | itemId | quantity | created 
123456 | 1  | 100  | 1478822402 
123457 | 1  | 5  | 1478736001 
123458 | 2  | 10  | 1478736001 
123459 | 2  | 40  | 1478822402 

我試圖得到一個結果集,它給我的項目今天和昨天賣出量的總和 - 按項目分組。例如:

item | numSoldToday | numSoldYesterday 
1  | 100   | 5 
2  | 40    | 10 

忽略出於測試目的硬編碼的時間戳,我可以只出售的商品今天利用這樣做:

SELECT item, sum(quantity) as numSoldToday FROM orders 
WHERE created >= 1478822400 AND created <= 1478908799 
GROUP by item 

而我能做的只是一個項目現在銷售VS做到這一點昨天使用子查詢:

SELECT sum(quantity) as numSoldToday, 
(SELECT (sum(quantity) FROM orders WHERE created >= 1478736000 AND created <= 1478822399 AND item = 1) as numSoldYesterday 
FROM orders 
WHERE created >= 1478822400 AND created <= 1478908799 AND item = 1 

但我似乎無法弄清楚如何將兩者結合起來 - 一個分組結果集的每一個項目的今天售出的數量與昨天不使用客戶端編程語言來獲取項目列表並循環遍歷每個項目,這似乎有點低效。

我試着在子查詢中放置一個GROUP BY,但是這只是給了我一個錯誤,我想不出用純粹的SQL做這件事的最好方法。

任何想法歡迎! 謝謝:-)

回答

1

你可以在聚合case語句而不是子查詢中做到這一點,像這樣;

SELECT 
o.item 
,SUM(CASE WHEN o.created >= 1478822400 AND o.created <= 1478908799 THEN quantity ELSE 0 END) numSoldToday 
,SUM(CASE WHEN o.created >= 1478736000 AND o.created <= 1478822399 THEN quantity ELSE 0 END) numSoldYesterday 
FROM orders o 
GROUP BY o.item 
+0

我想操作者正在尋找這樣做的所有日期。 –

+0

這不是我怎麼讀的:「但我似乎無法弄清楚如何將兩者結合起來 - 每個產品的分組結果集與今天與昨天的銷售數量對比。」我不認識那個日期格式,或者我會建議使用getdate()的東西 –

+0

我不是在尋找所有日期 - 每組時間戳代表「今天」(00.00-23.59)和「昨天」(相同) 。我只需要適合每個類別的數字。 – jeonatl3