sql - 使用动态透视/逆透视来正确显示

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

我相信我必须同时使用 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

我希望能够通过辅助代码(动态)分解列 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以及我用动态枢轴所做的所有工作。

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

谢谢

最佳答案

由于您尝试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

关于sql - 使用动态透视/逆透视来正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531522/

相关文章:

sql-server - 如何按原样将数据库从 SQL Server 2005 迁移到 2008?

sql-server - SQL Server 端口 445 和 1433

php - mysql - 查询显示刚刚添加的记录

sql-server - 在 SSIS 中设置字符串变量

SQL Server 递归查询

sql-server - Python 3 和 pypyodbc 存储过程错误

sql - 使用计数优化 DELETE 语句

Mysql 添加新列以供选择

php - 为什么我可以在 PHP 中的 SQLite 数据库上使用 SELECT 而不是 INSERT?

sql - Postgres : push unique object into an array of jsonb