在 sql 中对多列进行透视
Pivot in sql for multiple columns
我有一个 table 如下:
使用 pivot
我需要以下输出:
查询不应使用 Union
集合运算符。
您可以先UNPIVOT
按以下格式转换数据:
然后在 Type
列做 PIVOT
:
这是完整的工作示例:
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
当然,当您使用 PIVOT
和 UNPIVOT
时,您应该对列值进行硬编码。我想,在你的真实情况下,这不是一个选项,所以我会建议你使用动态 T-SQL
语句 - 将语句构建为字符串,然后使用 sp_executesql
.[= 执行它20=]
我有一个 table 如下:
使用 pivot
我需要以下输出:
查询不应使用 Union
集合运算符。
您可以先UNPIVOT
按以下格式转换数据:
然后在 Type
列做 PIVOT
:
这是完整的工作示例:
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
当然,当您使用 PIVOT
和 UNPIVOT
时,您应该对列值进行硬编码。我想,在你的真实情况下,这不是一个选项,所以我会建议你使用动态 T-SQL
语句 - 将语句构建为字符串,然后使用 sp_executesql
.[= 执行它20=]