【问题标题】:Sql server use pivot function to restruct datasql server使用pivot函数来限制数据
【发布时间】:2014-03-21 14:56:03
【问题描述】:

我在 SQL Server 2012 中有一个数据表,如下所示。我想做的是查询数据但重新构建布局。有一列称为“因子”,其中包含 7-8 个具有相应值的不同标签(值列)。我想要的是将这些因素作为列穿过 - 请参阅所需的输出部分以了解我的意思。编写查询以查看我的数据的最佳方式是什么?

期望的输出

pdate     abc     def   ghi
1-1-13    1       3     2
2-1-13    1       3     2

表格示例

factor     pdate     value
abc        1-1-13    1
def        1-1-13    3
ghi        1-1-13    2
abc        2-1-13    1
def        2-1-13    3
ghi        2-1-13    2
abc        3-1-13    1
def        3-1-13    3
ghi        3-1-13    2
abc        4-1-13    1
def        4-1-13    3
ghi        4-1-13    2    

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    正如 outisnihil 所说,更好的方法是使用 PIVOT

    使用PiVOT

      SELECT pdate
            , [abc]
            , [def]
            , [ghi]
        FROM YOUR_table
        PIVOT(SUM([value]) FOR factor IN (
                    [abc]
                    , [def]
                    , [ghi]
                    )) AS val
    

    使用CASE... 您可以为每个因子值使用一个大小写以在输出中生成一个新列。

    SELECT pdate
    , CASE 
    WHEN factor = 'abc' SUM(value) END abc
    , CASE 
    WHEN factor = 'def' SUM(value) END def
    , CASE 
    WHEN factor = 'ghi' SUM(value) END ghi 
    FROM YOUR_table GROUP BY pdate
    

    【讨论】:

    • 你不觉得 PIVOT 在这里更有意义吗?
    • @outisnihil: 添加了一个使用 PIVOT 的版本
    • +1:正确答案以动态版为补充
    【解决方案2】:

    如果您不想硬编码 [factor] 值,则使用动态版本...

    If      Object_ID('tempdb..#factorDateValues') Is Not Null Drop Table #factorDateValues
    Create  Table #factorDateValues (factor Varchar(50), pdate Date, value Int)
    
    Insert  #factorDateValues (factor, pdate, value)
    Values  ('abc','2013-01-01', 1),
            ('def','2013-01-01', 3),
            ('ghi','2013-01-01', 2),
            ('abc','2013-02-01', 1),
            ('def','2013-02-01', 3),
            ('ghi','2013-02-01', 2),
            ('abc','2013-03-01', 1),
            ('def','2013-03-01', 3),
            ('ghi','2013-03-01', 2),
            ('abc','2013-04-01', 1),
            ('def','2013-04-01', 3),
            ('ghi','2013-04-01', 2)
    
    Declare @sql Nvarchar(Max)
    
    Select  @sql = Coalesce(@sql + ',','') + '[' + factor + ']'
    From    #factorDateValues
    Group   By factor
    Order   By factor
    
    Set     @sql = 'Select  pDate,' + @sql +
                   'From    #factorDateValues
                    Pivot  (Max([value]) For factor In (' + @sql + ')) As val'
    
    Exec    sp_executeSQL @sql
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多