2016-11-11 11 views
1

誰かがこのクエリで私を助けることができますように願っています。SQL:サブクエリでデータをグループ化する

私はサンプルテーブルを持っている場合:私は私の今日と昨日販売された商品の数量の合計を与え、結果セットを取得しようとしています

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

- 項目ごとにグループ化されています。たとえば:

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

をそして私はちょうどONEアイテム販売今日の対のためにこれを行うことが可能です。テスト目的のためにハードコードされたタイムスタンプを無視

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

、私が使用して現在販売だけでアイテムのためにこれを行うことができます。昨日サブクエリ使用して:

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 

をしかし、私は2つの結合する方法を見つけ出すように見えることはできません - クライアント側を使用せずに、昨日対今日販売数と、各項目のグループ化された結果セットをプログラミング言語を使用して項目のリストを取得し、それぞれをループして少し効率が悪いように見えます。

私は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

私はopがすべての日付にこれを行うと考えていると思います。 –

+0

それは私がそれを読む方法ではありません: "しかし、私は2つを組み合わせる方法を把握していないように見える - 各項目のグループ化された結果セットは、私はその日付形式を認識していないか、getdate()を使って何かを提案しています –

+0

タイムスタンプの各グループは "今日"(00.00-23.59)と "昨日"(同じ) 。私はちょうど各カテゴリに合った番号が必要です。 – jeonatl3

関連する問題