2017-07-05 17 views
1

結果が連結される列にピボットする必要がある1:Mレコードセットがあります。SQLピボット1:M行から文字列へ

CREATE TABLE #temptable 
(
    ID int, 
    Division int, 
    Material int 
); 

insert into #temptable 
Values 
(999, 1, 1) 
,(999, 1, 2) 
,(999, 1, 3) 
,(999, 2, 1) 
,(999, 2, 6) 
,(999, 3, 2) 

サンプルデータ:

ID  Division  Material 
---- ---------- ---------- 
999  1   1   
999  1   2 
999  1   3 
999  2   1 
999  2   6 
999  3   2 

が、私は各部門のための材料が連結されている場合、結果はこのように見える必要があります。

サンプルデータを作成します

ID Division-1 Division-2 Division-3 
---- ---------- ---------- ---------- 
999  1,2,3   1,6   2 
+3

あなたは何か試しましたか? –

+0

そして、どのバージョンのSQL? – Shawn

+0

以下のカムランの答えがこの問題を解決しました。 – ScottM

答えて

1

試してみよう:

SELECT ID, 
     [1] AS 'Division-1', 
     [2] AS 'Division-2', 
     [3] AS 'Division-3' 
FROM 
(
    SELECT DISTINCT 
      a.ID, 
      a.Division, 
      LEFT(r.ResourceName, LEN(r.ResourceName) - 1) ResourceName 
    FROM #temptable a 
     CROSS APPLY 
    (
     SELECT CAST(Material AS VARCHAR(10))+',' 
     FROM #temptable t 
     WHERE a.[ID] = t.[ID] 
       AND a.Division = t.Division 
     FOR XML PATH('') 
    ) r(ResourceName) 
) src PIVOT(MAX(ResourceName) FOR Division IN([1], 
               [2], 
               [3])) piv; 

短い説明 カンマ区切りの構造でピボットを作成する必要があります。

以下のクエリは、列の値をコンマ区切りの行に変換します。

SELECT a.ID, 
     a.Division, 
     LEFT(r.ResourceName, LEN(r.ResourceName) - 1) ResourceName 
FROM #temptable a 
    CROSS APPLY 
(
    SELECT CAST(Material AS VARCHAR(10))+',' 
    FROM #temptable t 
    WHERE a.[ID] = t.[ID] 
      AND a.Division = t.Division 
    FOR XML PATH('') 
) r(ResourceName); 

その後、ピボットを作成します。

+0

これは私のkung-fuのレベルを超えて優れています。どうもありがとうございました。 – ScottM

+0

@ScottM:それが助けられた場合、人々が遭遇した場合の回答としてマークしてください –