2009-05-04 18 views
8

のは、私はテーブルがあるとしましょう:SQL複数の合計を選択していますか?

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

これは、特定の日付以降に販売数量を製品のリストを返します。この合計だけでなく、条件なしで合計を選択する方法はありますか?私はすべての(日付限定ではない)販売と並んで、各製品の特定の日付以降の販売を見たいと思います。

答えて

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

を相関サブクエリよりもはるかに高速でなければなりません:) –

+1

私ができる場合は、この20回upvoteだろう。あなたの例で私のクエリをリファクタリングし、以前のソリューション= D thxと比較してパフォーマンスが約5倍向上しました! –

0

あなたが並んで総売上高を見たい場合、あなたは合計(sale_amt)を使用することになり、このような

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

何か?:

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

を書き、中にすることができますsale_amtを追加してグループ化します。私はそれが助けて欲しい

0

GROUP BYを使用して、売上を日付に基づいて分割することができます。オラクルで あなたが言うことができます:

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; 
関連する問題