2017-07-30 5 views
0

まだT-SQLの初心者ですが、いくつかのジョインを持つ比較的単純なSELECTステートメントがあります。私はそれを動的ピボットテーブルに入れようとしています。この声明の目的は、新しいデータと古いデータが同じデータの異なる単語のペアに過ぎない、非営利のサービスとその結果を示すことです。ジョインでダイナミックSQLピボットテーブルを実行する方法を理解しようとしています

SELECT Service.Name, 
OutcomeIndicator."Desc" AS OutcomeDesc, 
NewOutcomeIndicator.Description As NewOutcomeDesc 
FROM service 
FULL OUTER JOIN OutcomeIndicator ON ServiceOutcomeIndicator.OutcomeIndicatorID=OutcomeIndicator.OutcomeIndicatorID 
FULL OUTER JOIN NewOutcomeIndicator ON NewOutcomeIndicatorMapping.NewOutcomeIndicatorID=NewOutcomeIndicator.NewOutcomeIndicatorID 

私はこの文を実行したときしかし、それは明らかに、各サービスは、複数のアウトカム/ NewOutcomeのペアを持つことができるためのServiceNameに複数の値を含めて、すべての行を返します。

+--------------+-----------------+-------------------+-----------------+-------------------+--------------+---------------------+ 
| ServiceName | OutcomeDesc1 | NewOutcomeDesc1 | OutcomeDesc2 | NewOutcomeDesc2 | OutcomeDesc3 | NewOutcomeDesc3 | 
+--------------+-----------------+-------------------+-----------------+-------------------+--------------+---------------------+ 
| Service34 | OutcomeDesc14 | NewOutcomeDesc14 | OutcomeDesc12 | NewOutcomeDesc12 |    |      | 
| Service35 | OutcomeDesc4 | NewOutcomeDesc4 |     |     |    |      | 
| Service44 | OutcomeDesc80 | NewOutcomeDesc80 | OutcomeDesc99 | NewOutcomeDesc99 |    |      | 
| Service51 | OutcomeDesc50 | NewOutcomeDesc50 |     |     |    |      | 
+--------------+-----------------+-------------------+-----------------+-------------------+--------------+---------------------+ 

私はこれを行うには、私のSQLステートメントを変更する方法上の任意のアイデア:これはExcelにコピーされているため、レポート作成のため

+-------------+----------------+------------------+ 
| ServiceName | OutcomeDesc1 | NewOutcomeDesc1 | 
+-------------+----------------+------------------+ 
| Service34 | OutcomeDesc14 | NewOutcomeDesc14 | 
| Service34 | OutcomeDesc12 | NewOutcomeDesc12 | 
| Service35 | OutcomeDesc4 | NewOutcomeDesc4 | 
| Service44 | OutcomeDesc80 | NewOutcomeDesc80 | 
| Service44 | OutcomeDesc99 | NewOutcomeDesc99 | 
| Service51 | OutcomeDesc50 | NewOutcomeDesc50 | 

は、私はより多くのこのような何かをしたいですか?私はサービスごとに3つ以上の結果がないことを知っているので、私は静的に列の数を定義することができます。

SQLで静的ピボットテーブルを実行する方法を理解していますが、何百ものサービスと結果があるため、各サービス値を統計的に列に割り当てるロジックを定義することはできません。動的なピボットテーブルは私が理解するのが少し難しいですが、私はこれを行ったチュートリアルを見つけることができませんでしたが、ジョインステートメントも含まれていました。

助けてください。

+0

あなたが事前に列の数を知っているので、あなたは、動的なピボットを必要としません。動的ピボットは、テーブルの値に基づいて列を作成するときに使用されます。 –

答えて

1

あなただけの、あなたが簡単にあなたがそこに現れた結果を取得した後

BY CASEおよびGROUPでシミュレートすることができ、実際にあなたも本物のピボットコマンドを使用する必要はありません、このためにダイナミックなピボットを必要としませんROW_NUMBER()関数を使用して各行に1〜3の番号を割り当て、最後にそのRNを使用して、どの列に入るかを選択します。

ここではスニペットを示します。実際のコードを最初のCTEに追加します。

WITH CTE_Source AS 
(
    --Your query goes here 
) 
, CTE_RN AS 
(
    SELECT * 
    , ROW_NUMBER() OVER (PARTITION BY ServiceName ORDER BY OutcomeDesc) RN 
    FROM CTE_Source 
) 
SELECT ServiceName 
, MAX(CASE WHEN RN = 1 THEN OutcomeDesc END) AS OutcomeDesc1 
, MAX(CASE WHEN RN = 1 THEN NewOutcomeDesc END) AS NewOutcomeDesc1 
, MAX(CASE WHEN RN = 2 THEN OutcomeDesc END) AS OutcomeDesc2 
, MAX(CASE WHEN RN = 2 THEN NewOutcomeDesc END) AS NewOutcomeDesc2 
, MAX(CASE WHEN RN = 3 THEN OutcomeDesc END) AS OutcomeDesc3 
, MAX(CASE WHEN RN = 3 THEN NewOutcomeDesc END) AS NewOutcomeDesc3 
FROM CTE_RN 
GROUP BY ServiceName 

DEMO using your data as SourceTable

関連する問題