TSQL-透视多个列

TSQL-透视多个列,sql,tsql,pivot,Sql,Tsql,Pivot,我需要帮助我的查询旋转多列,基本上,我只需要一个简单的查询,我不能得到我的头围绕它,希望有人能帮助我 未激活: 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_1

我需要帮助我的查询旋转多列,基本上,我只需要一个简单的查询,我不能得到我的头围绕它,希望有人能帮助我

未激活:

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
这应该起作用:

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

对于动态透视,您可以使用下面的查询(在动态透视中,列名的顺序不正确)


最后,这个问题得到了解决。 原因是缺少“分组依据”,因此根据数据透视列的数量,数据会加倍/三倍


如果您提供示例表结构及其填充脚本,人们可以更快地提供帮助。我相信示例足够了?分数百分比相关吗?不,不相关,它只能是数字。嗨,Pawel,这是一个很好的解决方案,我需要一个更具动态性的查询,因为我正在处理从ID_1到至少ID180的12个月列和度量。如果月份跨越两个不同的年份呢?在
透视/UNPIVOT
中未使用度量,因此无需动态执行。
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