【问题标题】:Using Dynamic Pivot/Unpivot to display correctly使用 Dynamic Pivot/Unpivot 正确显示
【发布时间】:2012-09-13 22:26:10
【问题描述】:

我相信我必须同时使用 Pivot 和 UnPivot 才能获得我想要的数据。

我目前的数据是这样的:

var_date    var_attribute   var_out_of_ad   var_per_ad
9/4/2012    Aux1            0               0
9/5/2012    Aux1            0               0
9/4/2012    Aux2            1680            0.733333333
9/5/2012    Aux2            1680            0.733333333
9/4/2012    Aux3            1500            0.791666667
9/5/2012    Aux3            1500            0.791666667
9/4/2012    Aux4            0               0
9/5/2012    Aux4            0               0
9/4/2012    Aux5            0               0
9/5/2012    Aux5            0               0
9/4/2012    Aux6            26640           0.766929134
9/5/2012    Aux6            26640           0.766929134
9/4/2012    Aux7            28800           0
9/5/2012    Aux7            28800           0
9/4/2012    Aux8            3600            0
9/5/2012    Aux8            3600            0

我希望能够通过 Aux Code(将通过动态)分解 var_out_of_advar_per_ad 列,所以我希望我的数据看起来像这样:

var_date  Aux1_per   Aux1_out   Aux2_per   Aux2_out ...
9/4/2012  0          0           .733      1680
9/5/2012  0          0           .733      1680

我已将测试数据放入一个 sql fiddle:http://sqlfiddle.com/#!3/7f06d/1 以及我使用动态枢轴所做的所有工作。

有人可以指导我下一步该怎么做吗?我迷路了。

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2005 pivot unpivot


    【解决方案1】:

    由于您尝试PIVOT两列数据,您需要先UNPIVOT,然后应用PIVOT

    DECLARE @colsPivot AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @colsPivot = Stuff((Select distinct ',' 
                               + QuoteName([var_attribute] + x.type) 
                        from mytable
                        cross apply
                        (
                          select '_per' type
                          union all
                          select '_out' type
                        ) x
                FOR XML Path(''), Type
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    set @query = 'select var_date, ' + @colsPivot + '
                  from
                  (
                    select var_date, 
                      val,
                      case col when ''var_out_of_ad'' 
                                  then VAR_ATTRIBUTE + ''_out''  
                              when ''var_per_ad'' 
                                  then VAR_ATTRIBUTE + ''_per'' end var_attribute 
                    from
                    (
                      select var_date, var_attribute,
                          cast(var_out_of_ad as float) var_out_of_ad,
                          var_per_ad
                      from mytable
                    ) x
                    unpivot
                    (
                      val
                      for col in (var_out_of_ad, var_per_ad)
                    ) u
                  ) x1
                  pivot
                  (
                    max(val)
                    for var_attribute in ('+@colsPivot +')
                  )p'
    
    exec(@query)
    

    SQL Fiddle with Demo

    【讨论】:

      猜你喜欢
      • 2016-02-21
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多