在sql中为多列进行透视

时间:2015-04-15 09:25:57

标签: sql sql-server tsql pivot

我有一张表如下:

enter image description here

使用pivot我需要以下输出:

enter image description here

查询不应使用Union set operator。

1 个答案:

答案 0 :(得分:4)

您可以先按以下格式UNPIVOT转换数据:

enter image description here

然后在PIVOT列之前执行Type

enter image description here

这是完整的工作示例:

DECLARE @DataSource TABLE
(
    [CatDes] CHAR(1)
   ,[val1] TINYINT
   ,[val2] TINYINT
);

INSERT INTO @DataSource ([CatDes], [val1], [val2])
VALUES ('a', 1 ,2)
      ,('b', 3 ,4)
      ,('c', 5 ,6)
      ,('d', 7 ,8);

SELECT *
FROM @DataSource
UNPIVOT
(
    [Value] FOR [Type] IN ([val1], [val2])
) UNPVT
PIVOT
(
    MAX([Value]) FOR [CatDes] IN ([a], [b], [c], [d])
) PVT

当然,当您使用PIVOTUNPIVOT时,您应该对列值进行硬编码。我想,在您的实际情况中,这不是一个选项,因此我建议您使用动态T-SQL语句 - 将语句构建为字符串,然后使用sp_executesql执行它。