2016-09-28 13 views
1

複数の列をピボットする際に私のクエリに助けが必要ですが、基本的に単純なクエリが必要です。TSQL - 複数の列をピボットする

ピボット解除:

MTH   ID  TEAM Metric_ID Score Outcome_Score 
1/10/2016 abc11 teamA ID_1  292  3 
1/11/2016 abc11 teamA ID_1  300  0 
1/10/2016 abc11 teamA ID_10  100  0 
1/11/2016 abc11 teamA ID_10  84  0 
1/10/2016 abc11 teamA ID_11  11%  0 
1/11/2016 abc11 teamA ID_11  12%  0 

されるように:

LANID TEAM Metric_ID Oct_Score Oct_Outcome_Score Nov_Score Nov_Outcome_Score 
abc11 teamA ID_1  292   3     300   0 
abc11 teamA ID_10  100   0     84   0 
abc11 teamA ID_11  11%   0     12%   0 

私は以下のが出ているが、毎回私はアウトカムのフィールドを追加してい、それは完全にクエリを台無し。実際のクエリはより複雑です。私はただのアイデアが必要です。ありがとう。

SELECT   ID AS LANID, Team, Metric_ID 
       , CONVERT(varchar(3), MTH, 100) SMTH 
       , Oct_Score 
       , Oct_Outcome_Score 
       , Nov_Score 
       , Nov_Outcome_Score 
FROM   TableA 
PIVOT 
    (
       SUM(Score) 
       FOR SMTH IN (Oct_Score, Nov_Score) 
    ) AS P 
+0

それはあなたがサンプルテーブルの構造とその移入スクリプトを提供する場合は、人々が支援するためにはるかに高速になります。 –

+0

私はサンプルが十分だと思いますか? – lucas

+0

スコアの%は関連していますか? –

答えて

1

これは動作するはずです:

WITH Src AS 
(
    SELECT * FROM (VALUES 
    ('1/10/2016', 'abc11', 'teamA', 'ID_1 ', 292, 3), 
    ('1/11/2016', 'abc11', 'teamA', 'ID_1 ', 300, 0), 
    ('1/10/2016', 'abc11', 'teamA', 'ID_10', 100, 0), 
    ('1/11/2016', 'abc11', 'teamA', 'ID_10', 84, 0), 
    ('1/10/2016', 'abc11', 'teamA', 'ID_11', 11, 0), 
    ('1/11/2016', 'abc11', 'teamA', 'ID_11', 12, 0) 
    )T(MTH, ID, TEAM, Metric_ID, Score, Outcome_Score) 
) 
SELECT * FROM 
(
    SELECT ID, TEAM, Metric_ID, Value, 
     CASE WHEN DATEPART(M, MTH)=10 THEN 'Oct_' 
      WHEN DATEPART(M, MTH)=11 THEN 'Nov_' END+Col ToPivot 
    FROM 
    (SELECT CONVERT(date, MTH, 103) MTH, ID, TEAM, Metric_ID, Score, Outcome_Score FROM Src) T1 
    UNPIVOT (Value FOR Col IN (Score, Outcome_Score)) U1 
) T 
PIVOT (SUM(Value) FOR ToPivot IN (Oct_Score, Oct_Outcome_Score, Nov_Score, Nov_Outcome_Score)) P 

結果:あなたが怒鳴るクエリを使用することができ

ID TEAM Metric_ID Oct_Score Oct_Outcome_Score Nov_Score Nov_Outcome_Score 
----- ----- --------- ----------- ----------------- ----------- ----------- 
abc11 teamA ID_1  292   3     300   0 
abc11 teamA ID_10  100   0     84   0 
abc11 teamA ID_11  11   0     12   0 
+0

こんにちはPawel、これは優れたソリューションですが、ID_1から少なくともID180までの12ヶ月の列とメトリックを扱っているので、より動的なクエリが必要です。 – lucas

+0

月が2つの異なる年にまたがる場合はどうなりますか?メトリックは 'PIVOT/UNPIVOT'で使われていないので、動的に行う必要はありません。 –

1

ダイナミック旋回するように(ダイナミックピボット列名ではない適切な順序になります)

CREATE Table #Item(id varchar(250),team varchar(250),Metric_ID varchar(20),col varchar(250),Score int) 
;WITH Src AS(SELECT * FROM (VALUES ('10/1/2016', 'abc11', 'teamA', 'ID_1 ', 292, 3),('11/1/2016', 'abc11', 'teamA', 'ID_1 ', 300, 0),('10/1/2016', 'abc11', 'teamA', 'ID_10', 100, 0),('11/1/2016', 'abc11', 'teamA', 'ID_10', 84, 0),('10/1/2016', 'abc11', 'teamA', 'ID_11', 11, 0),('11/1/2016', 'abc11', 'teamA', 'ID_11', 12, 0))T(MTH,ID, TEAM, Metric_ID, Score, Outcome_Score)) 
INSERT INTO #Item 
select ID,TEAM,Metric_ID,DateName(M, DateAdd(M, MONTH(MTH), -1))+'_Score',Score from Src 
UNION ALL 
select ID,TEAM,Metric_ID,DateName(M, DateAdd(M, MONTH(MTH), -1))+'_Outcome_Score',Outcome_Score from Src 
DECLARE @Query AS NVARCHAR(MAX) DECLARE @ColumnName AS NVARCHAR(MAX) 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') + QUOTENAME(col) 
FROM (SELECT DISTINCT col FROM #Item) AS ColName 
SET @Query = N'SELECT ID,TEAM,Metric_ID ,' + @ColumnName + 'FROM #Item PIVOT(SUM(Score) FOR col IN (' + @ColumnName + ')) AS PVTTable' 
EXEC sp_executesql @Query 
Drop table #Item 
関連する問題