【问题标题】:PIVOT in SQL Server 2012 - new to SQL [duplicate]SQL Server 2012 中的 PIVOT - SQL 的新功能 [重复]
【发布时间】:2016-11-17 02:21:26
【问题描述】:

我在下一种情况下遇到了一些麻烦:我需要为语句选择 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

非常感谢您的支持。

【问题讨论】:

    标签: sql sql-server-2012 pivot


    【解决方案1】:

    考虑到列标题等于字段 [2] 的内容并且不在列 [2] 中提供重复值,我使用 PIVOT 表进行了此练习,这可能会对您有所帮助:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 2013-03-24
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 2010-10-18
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多