SQL Server 2012中的PIVOT - SQL的新手

时间:2016-07-14 08:48:53

标签: sql sql-server-2012 pivot

我在下一个情况遇到一些麻烦:我需要为一个语句选择4个位置,我需要将这些位置作为列进行旋转。数据库的结构如下:StatementId 1,PositionId 2,RepCurrValue 3.例如,对于StatementId = 55,对于position = 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

非常感谢您的支持。

1 个答案:

答案 0 :(得分:0)

我使用PIVOT表做了这个练习,可以帮助你,考虑到列标题等于字段[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

非动态解决方案可以是:

select *
from 
(
   SELECT [1],[2],[3] FROM TB_1 
) x
pivot
(
  max([3])
  for [2] in ([58] , [62] , [67] , [82] )
) p