2016-09-28 2 views
1

Ich brauche Hilfe bei meiner Abfrage in mehrere Spalten zu schwenken, im Grunde brauche ich nur eine einfache Abfrage und ich kann nicht meinen Kopf drum herum, hoffe jemand kann mir helfen.TSQL - Pivot mehrere Spalten

Ohne Pivoting:

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 

zu WERDEN:

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 

Ich habe unten kommen, aber jedes Mal wenn ich das Feld für Outcome bin hinzufügen, es vermasselt die insgesamt Abfrage. Die tatsächliche Abfrage ist komplexer. Ich brauche nur eine Idee. Vielen Dank.

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

Es wäre viel schneller sein für Leute, wenn Sie die Beispieltabellenstruktur und seine Besiedlungs Skript bereitstellen würde zu helfen. –

+0

Ich glaube, die Probe ist ausreichend? – lucas

+0

Ist% in der Punktzahl relevant? –

Antwort

1

Dies sollte funktionieren:

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 

Ergebnis:

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

Hallo Pawel, dies ist eine ausgezeichnete Lösung, aber ich brauche eine Abfrage, die dynamischer ist, wie ich mit 12 Monate Spalte und Metrik von ID_1 bis mindestens ID180 beschäftigen. – lucas

+0

Was ist, wenn Monate zwei verschiedene Jahre umfassen? Metric wird nicht in 'PIVOT/UNPIVOT' verwendet, es ist nicht notwendig, dies dynamisch zu tun. –

1

auf dynamische Pivot Sie unten Abfrage verwenden kann (im dynamischen Pivotspaltenname wird in der richtigen Reihenfolge nicht)

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