SQL Server 2012 中的 PIVOT - SQL 的新功能
PIVOT in SQL Server 2012 - new to SQL
我在下一种情况下遇到了一些麻烦:我需要 select 4 个位置作为语句,我需要将这些位置作为列进行旋转。数据库的结构为:StatementId 1,PositionId 2,RepCurrValue 3。例如,对于 StatementId = 55 和位置 = 58 OR 62 OR 67 OR 82,结果为:
1 2 3
-----------------
55 58 146,8000
55 62 59,9800
55 67 800,0500
55 82 136,7600
我希望它成为
1 58 62 67 82
---------------------------------------
55 146,8000 59,9800 800,0500 136,7600
非常感谢您的支持。
我用 PIVOT table 做了这个练习,考虑到列标题等于字段 [2] 的内容并且不在列 [2] 中提供重复值:
DECLARE @cols AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT ',[' + convert(nvarchar,(t.[2])) + ']' AS ID
FROM TB_1 t
FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1, '')
DECLARE @query AS NVARCHAR(MAX);
SET @query = N'SELECT p.[1],' + @cols + N' from
(
SELECT [1],[2],[3] FROM TB_1
) x
pivot
(
max([3])
for [2] in (' + @cols + N')
) p
'
exec sp_executesql @query;
下方添加一个额外的StatementId(56)和与StatementId(56)关联的新的不同位置(90,91)得到的结果
1 58 62 67 82 90 91
55 146,8000 59,9800 800,0500 136,7600 NULL NULL
56 NULL NULL NULL NULL 185,74 185,74
一个non-dynamic解决方案可以是:
select *
from
(
SELECT [1],[2],[3] FROM TB_1
) x
pivot
(
max([3])
for [2] in ([58] , [62] , [67] , [82] )
) p
我在下一种情况下遇到了一些麻烦:我需要 select 4 个位置作为语句,我需要将这些位置作为列进行旋转。数据库的结构为:StatementId 1,PositionId 2,RepCurrValue 3。例如,对于 StatementId = 55 和位置 = 58 OR 62 OR 67 OR 82,结果为:
1 2 3
-----------------
55 58 146,8000
55 62 59,9800
55 67 800,0500
55 82 136,7600
我希望它成为
1 58 62 67 82
---------------------------------------
55 146,8000 59,9800 800,0500 136,7600
非常感谢您的支持。
我用 PIVOT table 做了这个练习,考虑到列标题等于字段 [2] 的内容并且不在列 [2] 中提供重复值:
DECLARE @cols AS NVARCHAR(MAX)
SET @cols = STUFF((SELECT ',[' + convert(nvarchar,(t.[2])) + ']' AS ID
FROM TB_1 t
FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1, '')
DECLARE @query AS NVARCHAR(MAX);
SET @query = N'SELECT p.[1],' + @cols + N' from
(
SELECT [1],[2],[3] FROM TB_1
) x
pivot
(
max([3])
for [2] in (' + @cols + N')
) p
'
exec sp_executesql @query;
下方添加一个额外的StatementId(56)和与StatementId(56)关联的新的不同位置(90,91)得到的结果
1 58 62 67 82 90 91
55 146,8000 59,9800 800,0500 136,7600 NULL NULL
56 NULL NULL NULL NULL 185,74 185,74
一个non-dynamic解决方案可以是:
select *
from
(
SELECT [1],[2],[3] FROM TB_1
) x
pivot
(
max([3])
for [2] in ([58] , [62] , [67] , [82] )
) p