2017-02-23 17 views
0

レポートを生成しようとしていますが、今のところ、 。複雑な選択合計に結合をネストする方法(ケース、グループ・バイ・ステートメント

TableAの構造は次のようになります。

Sales Order | Order Status | Order Date 
123456789 | 1 | 2017-02-22 00:00:00.000 
123456790 | 0 | 2017-02-21 00:00:00.000 

TableBの構造は次のようになります。

Sales Order | Price 
123456789 | 123.00 
123456789 | 42.00 
123456790 | 56.00 
123456790 | 28.00 

このコード:

SELECT 
    MAX(year([OrderDate])) as Yr, 
    MAX(MONTH([OrderDate])) as M, 
    Day([OrderDate]) as Day, 
    sum(case when [OrderStatus]='0' THEN 1 ELSE 0 END) AS 'STATUS"0"', 
    sum(case when [OrderStatus]='1' THEN 1 ELSE 0 END) AS 'STATUS"1"', 
    sum(case when [OrderStatus]='2' THEN 1 ELSE 0 END) AS 'STATUS"2"', 
    sum(case when [OrderStatus]='4' THEN 1 ELSE 0 END) AS 'STATUS"4"', 
    sum(case when [OrderStatus]='8' THEN 1 ELSE 0 END) AS 'STATUS"8"', 
    sum(case when [OrderStatus]='9' THEN 1 ELSE 0 END) AS 'STATUS"9"', 
    sum(case when [OrderStatus]='S' THEN 1 ELSE 0 END) AS 'STATUS"S"', 
    sum(case when [OrderStatus]='*' THEN 1 ELSE 0 END) AS 'STATUS"*"', 
    sum(case when [OrderStatus]='/' THEN 1 ELSE 0 END) AS 'STATUS"/"' 
FROM 
    SorMaster 
WHERE 
    YEAR([OrderDate]) = YEAR(GETDATE()) 
GROUP BY 
    DATENAME(month, DateAdd(month, Month([OrderDate]) - 1, Cast('2008-01-01' AS Datetime))), Day([OrderDate]) 
ORDER BY 
    Yr DESC, M DESC, Day DESC 

戻り値この:

Yr | M | Day | STATUS"0" | STATUS"1" | STATUS"2" | STATUS"4" | STATUS"8" | STATUS"9" | STATUS"S" | STATUS"*" | STATUS"/" 
2017 2 22 0 2 0 1 0 0 5 0 0 
2017 2 21 0 0 0 7 0 0 0 0 0 

これが私の最初の報告のために最適です。

今、問題が発生します。私の問題は、テーブルBを入れ子にする必要があるため、カウント(注文)を返す代わりに、各注文の合計が表Bにあるようにする必要があるということです。

上記の例を使用すると、クエリは次のようなものを返す必要があります:

Yr | M | Day | STATUS"0" | STATUS"1" | STATUS"2" | STATUS"4" | STATUS"8" | STATUS"9" | STATUS"S" | STATUS"*" | STATUS"/" 
2017 2 22 0 165 0 0 0 0 0 0 0 
2017 2 21 84 0 0 0 0 0 0 0 0 

すべてのポインタはありますか?

+0

これはどのRDBMSですか? MySQL、PostgreSQL、Oracle、SQL Server、IBM DB2などを使用しているかどうかにかかわらず、多くの場合違いがあります。あなたの質問に関連タグを追加してください! –

答えて

0

tableBを結合して(左)、tableB.priceによって 'count'を置き換えると、ステータスに応じた注文のすべての位置の合計を取得する必要があります。

1

ただTableBに参加:

SELECT MAX(year([t1.OrderDate])) AS Yr, 
     MAX(MONTH([t2.OrderDate])) AS M, 
     DAY([t1.OrderDate]) AS Day, 
     SUM(CASE WHEN [OrderStatus] = '0' THEN t2.Price ELSE 0 END) AS 'STATUS"0"', 
     SUM(CASE WHEN [OrderStatus] = '1' THEN t2.Price ELSE 0 END) AS 'STATUS"1"', 
     SUM(CASE WHEN [OrderStatus] = '2' THEN t2.Price ELSE 0 END) AS 'STATUS"2"', 
     SUM(CASE WHEN [OrderStatus] = '4' THEN t2.Price ELSE 0 END) AS 'STATUS"4"', 
     SUM(CASE WHEN [OrderStatus] = '8' THEN t2.Price ELSE 0 END) AS 'STATUS"8"', 
     SUM(CASE WHEN [OrderStatus] = '9' THEN t2.Price ELSE 0 END) AS 'STATUS"9"', 
     SUM(CASE WHEN [OrderStatus] = 'S' THEN t2.Price ELSE 0 END) AS 'STATUS"S"', 
     SUM(CASE WHEN [OrderStatus] = '*' THEN t2.Price ELSE 0 END) AS 'STATUS"*"', 
     SUM(CASE WHEN [OrderStatus] = '/' THEN t2.Price ELSE 0 END) AS 'STATUS"/"' 
FROM SorMaster t1 
LEFT JOIN TableB t2 
    ON t1.[Sales Order] = t2.[Sales Order] 
WHERE YEAR([OrderDate]) = YEAR(GETDATE()) 
GROUP BY DATENAME(month,DateAdd(month,Month([OrderDate])-1,Cast('2008-01-01' AS Datetime))), 
     DAY([OrderDate]) 
ORDER BY Yr DESC, M DEACLLSC, Day DESC 
+0

おそらく残された... – RuDevel

+0

これは働いた。ありがとう! – Daniel

1

だけLEFTの問題は、テーブルBに参加し、その中で価格を合計し、あまりにも難しいことではありませんこと。ここには小さなトリックがいくつかあります。テーブルBに対応する行がない場合でも、テーブルAの行が常に表示されるようにするには、LEFT JOINする必要があります。SUM()ステートメントでは、小数点以下を合計するためにCOALESCE(...,0.00)を追加する必要があります。 LEFT JOINからNULL値が入り込みません。データベースでは変わって、NULL + {anything} = NULL

TableBの名前をテーブル名と同じに変更する必要があります。JOIN述部には、名前が正確に指定されている必要があり、スペースが含まれていると正しく区切られます。例えば、MSSQLでは、デリミタは[]です。 MyTable.[My Column With Spaces]

SELECT 
    MAX(YEAR([OrderDate])) as Yr, 
    MAX(MONTH([OrderDate])) as M, 
    DAY([OrderDate]) as Day, 
    sum(case when [OrderStatus]='0' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"0"', 
    sum(case when [OrderStatus]='1' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"1"', 
    sum(case when [OrderStatus]='2' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"2"', 
    sum(case when [OrderStatus]='4' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"4"', 
    sum(case when [OrderStatus]='8' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"8"', 
    sum(case when [OrderStatus]='9' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"9"', 
    sum(case when [OrderStatus]='S' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"S"', 
    sum(case when [OrderStatus]='*' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"*"', 
    sum(case when [OrderStatus]='/' THEN COALESCE(TableB.Price, 0.00) ELSE 0.00 END) AS 'STATUS"/"' 
FROM SorMaster 
LEFT OUTER JOIN TableB 
    ON TableB.SalesOrder = SorMaster.SalesOrder 
WHERE YEAR([OrderDate]) = YEAR(GETDATE()) 
GROUP BY 
    DATENAME(month,DateAdd(month,Month([OrderDate])-1,Cast('2008-01-01' AS Datetime))), 
    DAY([OrderDate]) 
ORDER BY 
    Yr DESC, 
    M DESC, 
    Day DESC 
+0

これもうまくいった!詳細な説明をありがとう – Daniel

関連する問題