2016-11-23 7 views
0

にピボット私はテーブルを持っているSQL:期間の複数の列

Name | Value1 | Value2 
-----+--------+------ 
A | 2,5,6 | 3,4,7 
B | 2,5,6 | 3,4,7 
のような私は必要

Name | Period | Value1 | Value2 
-----+---------+---------+------- 
A  1  2  3 
A  2  5  4 
A  3  6  7 
B  1  2  3 
B  2  5  4 
B  3  6  7 

結果

数が動的であるが、私は簡単にするため、それを処理する方法を知っています、のは3期

は、以下のクエリは私に値1の結果を与えるがあるとしましょう。どのようにして両方の結果を得ることができますか? 私はいつもそれらを別々にしてから参加することができますが、テーブルは本当に大きく、2つではなく4つの値を「結合」する必要があります。私は1つの声明でそれをすることができますか?

SELECT Name, 
[1]+','+ [2] + ','+ [3] ValueString 
FROM (
select Name, period, cpr from #MyTable  
) as s  
    PIVOT(SUM(Value1)   
    FOR period IN ([1],[2],[3]) 
+0

を入手するには、これは本当にピボットではないことに注意してください - それは集合です。ピボットは、明示的に列の値を新しい列に変換します。この場合、たとえば、期間ごとに列を作成することができます。 –

答えて

4

条件付き集計を使用します。文字列に値を組み合わせることにより、SQL ServerでのXMLのロジックを必要とし、少しトリッキーです:

select n.name, 
     stuff((select ',' + cast(value1 as varchar(max)) 
       from t 
       where n.name = t.name 
       order by t.period 
       for xml path ('') 
      ), 1, 1, '' 
      ) as values1, 
     stuff((select ',' + cast(value2 as varchar(max)) 
       from t 
       where n.name = t.name 
       order by t.period 
       for xml path ('') 
      ), 1, 1, '' 
      ) as values2 
from (select distinct name 
     from t 
    ) n; 

あなたの値は、数値、したがって明示的なキャストとXMLの特殊文字への関心の欠如のように見えます。

distinctはなぜ外側のクエリではなくサブクエリにあるのかと聞かれるかもしれません。外側のクエリで実行された場合、SQLエンジンはdistinctを実行する前に、のすべての行の集計を実行します。オプティマイザが名前ごとにサブクエリを1回だけ実行するのに十分なのかどうかはわかりません。スタッフ機能でグループ化を使用して

+2

は、スタッフクエリにピリオドで注文を追加することができます。 – SqlZim

+0

ありがとうございました。できます! – anjulis

+1

@SqlZim。 。 。良いアイデア。 –

0

と期待される結果

SELECT Name , STUFF((SELECT ',' + CAST(Value1 AS VARCHAR) FROM #MyTable T2 WHERE T1.Name = T2.Name FOR XML PATH('')),1,1,'') Value1 
     , STUFF((SELECT ',' + CAST(Value2 AS VARCHAR) FROM #MyTable T3 WHERE T1.Name = T3.Name FOR XML PATH('')),1,1,'') Value2 FROM #MyTable T1 GROUP BY Name