2016-08-10 6 views
0

where句でこの条件に与える適切な名前がわかりません。私はMicrosoft SQL Server 2008を使用しています。where句にサブ条件を追加する

基本的には、次の列の注文表があります。

MyOrderTable:現在

OrderAmount Paid OrderDate 
100   Y  2016-08-10 21:15:52.000 
120   N  2016-08-10 20:15:12.000 
300   Y  2016-08-09 11:10:22.000 
500   Y  2016-06-09 10:10:54.000 
125   N  2016-06-09 09:15:13.000 
325   N  2015-11-09 09:15:13.000 

、私は次のSQLクエリを持っている:

SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount 
FROM MyOrderTable 
WHERE YEAR(OrderDate) = 2016 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth 

結果は、上記のSQLから返されるには、以下のようなものです:

TheYear  TheMonth SumOrderAmount 
2016  6   625 
2016  8   520 

どのようにすることができます私はまた行が支払われているSumOrderAmountを照会します= 'Y'?私はSQLから次のものを返す:

TheYear  TheMonth SumOrderAmount PaidSumOrderAmount 
2016  6   625    500 
2016  8   520    400 

どうすればいいですか?どんな助けでも大歓迎です。ありがとうございました。

答えて

1

条件付き集約用途:

SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount, 
     SUM(CASE WHEN Paid = 'Y' THEN OrderAmount ELSE 0 END) as PaidOrderAmount 
FROM MyOrderTable 
WHERE YEAR(OrderDate) = 2016 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth; 

おそらくSUM()ISNULL()は必要ありません。 SQLの場合、SUM()集計関数ではNULLの値は無視されます。

+1

だからそれは言われた後、彼はあまりにも '0' ELSEを必要としません:) – sagi

+1

@sagiを。 。 。 Au contraire。これは、マッチがないときに「NULL」値を防止するために必要です。なぜなら、月には支払額がないと仮定するのが妥当であるからです。一方、1ヶ月間の支払い金額がすべて「NULL」だった場合は、合計金額も必要になります。提供されたデータを考えると、そうは思われません。 –

+1

OPに有料の売上がない月がある場合は、おそらく0ではなくNULL値よりも大きな問題です。 – jarlh

1

は条件付きSUM()を行うにはcase式を使用します。

SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount, 
     SUM(case when Paid='Y' then OrderAmount end) 
FROM MyOrderTable 
WHERE YEAR(OrderDate) = 2016 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth 
0

が選択にこの句を追加します。

SUM(CASE WHEN Paid='Y' THEN OrderAmount ELSE 0 END) AS PaidSumOrderAmount 
0
SELECT DATEPART(Year, OrderDate) TheYear, DATEPART(Month, OrderDate) TheMonth, 
     SUM(ISNULL(OrderAmount, 0)) as SumOrderAmount,Paid 
FROM MyOrderTable 
WHERE (YEAR(OrderDate) = 2016) and (Paid = 'Y') 
GROUP BY DATEPART(Year, OrderDate), DATEPART(Month, OrderDate) 
ORDER BY TheYear, TheMonth 
+0

OPは以前のようにSumOrderAmount列を保持する必要があることに注意してください。 – jarlh

+0

@jarlh申し訳ありません私は英語のverryをよく理解しています –

+0

@jarlhあなたの答えとGordon Linoffは同じです –

関連する問題