2017-04-25 11 views
1

特定のLabourID(L_ID)に対して、月あたりのトランザクションの合計数を示すレポートを作成しようとしています。しかし、私は何を得ようとしているのか分からない。次のようにSQL Server 2014 - コードのエラー

私のコードは次のとおりです。

SET NOCOUNT ON 

Declare @S AS DateTime = ISNULL(@StartDate,DateAdd(d,-60,GETDATE())) 
IF OBJECT_ID('tempdb..#Count') IS NOT NULL DROP TABLE #Count; 

SELECT Year(TranxDate) AS YY 
     ,Month(TranxDate) AS MM 
     ,TT.L_ID 
     ,count(IR.T_TransactionId) TranxCount 

INTO #Count 

FROM  IR 
INNER JOIN TT ON IR.T_TransactionId = TT.T_TransactionId 

WHERE [TranxDate] >= @StartDate 
    AND [Some condition] 
    AND [Some condition] 
    AND [Some condition] 
    AND TT.L_ID IN ('502','701','18','22','702','503') 

GROUP BY Year(TranxDate), Month(TranxDate), TT.L_ID 


SELECT YY 
     ,MM 
     ,(SELECT TranxCount FROM #Count WHERE L_ID = '701')ID701 
     ,(SELECT TranxCount FROM #Count WHERE L_ID = '502')ID502 
     ,(SELECT TranxCount FROM #Count WHERE L_ID = '18')ID18 
     ,(SELECT TranxCount FROM #Count WHERE L_ID = '22')ID22 
     ,(SELECT TranxCount FROM #Count WHERE L_ID = '702')ID702 
     ,(SELECT TranxCount FROM #Count WHERE L_ID = '503')ID503 

FROM #Count 

GROUP BY YY, MM, L_ID 

ORDER BY YY, MM 

私はこのコードからエラーメッセージが表示されます。

サブクエリは複数の値を返しました。 サブクエリが、=、!<、< =、>、> =、またはサブクエリが式 として使用されている場合は、これは許可されません。次のようにTempTableの#Countの

結果は次のように私はしたいと思います

Year Month L_ID TranxCount 
2016 9  18  4141 
2016 9  22  637 
2016 9  502  7782 
2016 9  503  531 
2016 9  701  7529 
2016 9  702  1577 
2016 10  18  4611 
2016 10  22  1007 
2016 10  502  9763 
2016 10  503  507 
2016 10  701  10093 
2016 10  702  2176 
2016 11  18  5421 
2016 11  22  1471 
2016 11  502  11505 
2016 11  503  613 
2016 11  701  12530 
2016 11  702  2569 

結果は以下のとおりです。私は私のコードで間違った

YEAR Month ID701 ID502 ID18 ID22 ID702 ID503 
2016 9  7529 7782 4141 637  1577 531 
2016 10  10093 9763 4611 1007 2176 507 
2016 11  12530 11505 5421 1471 2569 613 
2016 12  ... 
2017 1 
... 
... 
.. 
. 

何をしています?

EDIT:@Seanの提案を1として

、私は次のコードを追加:

SELECT YY 
     ,MM 
     , MAX(Case when L_ID = '701' then TranxCount end) as ID701 
     , MAX(Case when L_ID = '502' then TranxCount end) as ID502 
     , MAX(Case when L_ID = '18' then TranxCount end) as ID18 
     , MAX(Case when L_ID = '22' then TranxCount end) as ID22 
     , MAX(Case when L_ID = '702' then TranxCount end) as ID702 
     , MAX(Case when L_ID = '503' then TranxCount end) as ID503 
FROM #Count 
GROUP BY YY, MM, L_ID 
ORDER BY YY, MM 

をしかし、私は次のような結果だ:

YY  MM ID701 ID502 ID18 ID22 ID702 ID503 
2017 1 NULL NULL 2793 NULL NULL NULL 
2017 1 NULL NULL NULL 1407 NULL NULL 
2017 1 NULL 7763 NULL NULL NULL NULL 
2017 1 NULL NULL NULL NULL NULL 608 
2017 1 7919 NULL NULL NULL NULL NULL 
2017 1 NULL NULL NULL NULL 832 NULL 
2017 2 NULL NULL 2874 NULL NULL NULL 
2017 2 NULL NULL NULL 1694 NULL NULL 
2017 2 NULL 7369 NULL NULL NULL NULL 
2017 2 NULL NULL NULL NULL NULL 489 
2017 2 8306 NULL NULL NULL NULL NULL 
2017 2 NULL NULL NULL NULL 778 NULL 
2017 3 NULL NULL 3809 NULL NULL NULL 
2017 3 NULL NULL NULL 2003 NULL NULL 
2017 3 NULL 10368 NULL NULL NULL NULL 

は少なくとも進展がありますが。 Nullレコードを削除し、代わりにNullレコードを欲しがっているような方法がありますか?

EDIT 2:@Sean提案あたりとして

、私は、次のコードを加え、次いで、一時表と判断:

:私はエラーメッセージを持っ

SELECT YY 
     ,MM 
     , MAX(Case when L_ID = '701' then TranxCount end) as ID701 
     , MAX(Case when L_ID = '502' then TranxCount end) as ID502 
     , MAX(Case when L_ID = '18' then TranxCount end) as ID18 
     , MAX(Case when L_ID = '22' then TranxCount end) as ID22 
     , MAX(Case when L_ID = '702' then TranxCount end) as ID702 
     , MAX(Case when L_ID = '503' then TranxCount end) as ID503 
INTO #TotCount 
FROM #Count 
GROUP BY YY, MM, L_ID 
ORDER BY YY, MM 

SELECT YY 
    ,MM 
    ,SUM(ID701) 
    ,SUM(ID502) 
    ,SUM(ID18) 
    ,SUM(ID22) 
    ,SUM(ID702) 
    ,SUM(ID503) 

FROM #TotCount 

GROUP BY YY, MM, L_ID 

ORDER BY YY, MM 

無効な列L_ID

+0

私はそれらがあなたの実際のテーブル名ではないことを願っています。ヤックエラーはかなり明確です。少なくとも1つのサブクエリが1行以上を返しています。 –

答えて

1

私は、NULL値を取り出した、別の一時テーブルを作成した後、第2一時テーブルから値のSUMを引き上げることによって、これを解決しました。
L_IDのグループも削除しました。次のように

だから私のコードは次のとおりです。

SELECT YY 
     ,MM 
     , MAX(Case when L_ID = '701' then TranxCount end) as ID701 
     , MAX(Case when L_ID = '502' then TranxCount end) as ID502 
     , MAX(Case when L_ID = '18' then TranxCount end) as ID18 
     , MAX(Case when L_ID = '22' then TranxCount end) as ID22 
     , MAX(Case when L_ID = '702' then TranxCount end) as ID702 
     , MAX(Case when L_ID = '503' then TranxCount end) as ID503 
INTO #TotCount 
FROM #Count 
GROUP BY YY, MM, L_ID 
ORDER BY YY, MM 

SELECT YY 
    ,MM 
    ,SUM(ID701) 
    ,SUM(ID502) 
    ,SUM(ID18) 
    ,SUM(ID22) 
    ,SUM(ID702) 
    ,SUM(ID503) 

FROM #TotCount 

GROUP BY YY, MM--, L_ID 

ORDER BY YY, MM 

このコードは、働いていたと私に望ましい結果を与えました。

@Seanさん、ありがとうございました。それは有り難いです。

+0

最初のグループからL_IDを削除するだけで、同じデータの別のコピーは必要ありません。 –

2

おそらく、このために条件付き集計を使用できます。

SELECT YY 
     ,MM 
     , MAX(Case when L_ID = '701' then TranxCount end) as ID701 
     , MAX(Case when L_ID = '502' then TranxCunt end) as ID502 
     , MAX(Case when L_ID = '18' then TranxCount end) as ID18 
     , MAX(Case when L_ID = '22' then TranxCount end) as ID22 
     , MAX(Case when L_ID = '702' then TranxCount end) as ID702 
     , MAX(Case when L_ID = '503' then TranxCount end) as ID503 
FROM #Count 
GROUP BY YY, MM, L_ID 
ORDER BY YY, MM 
+0

ありがとう@Sean。しかし、あなたのコードは私にヌル値を与えます(私の質問でEDITを見てください)。どのようにNullの値を削除し、代わりに私が望むようにそれを表示しますか? – user1777929

+0

グループからL_IDを取り出します。 –

関連する問題