【问题标题】:How can I UNPIVOT columns into rows?如何将列 UNPIVOT 转换为行?
【发布时间】:2014-08-30 07:17:55
【问题描述】:

考虑下表#document_fields

id   x   y    z
------------------
1  foo  bar  baz
2  one  two  three
3  aaa  bbb  ccc
4  123  456  789

列数可能会有所不同,列名也会有所不同。我需要将列转成这样的行:

id  field value
---------------
1   x     foo
1   y     bar
1   z     baz
2   x     one
2   y     two
2   z     three
.
.
3   z     789

我正在尝试了解 SQL Server 中枢轴的工作方式,但没有比这更进一步的了:

select 
      *
into
      #document_fields_pivot
from (
      select * from (
            select *
            from #document_fields
      ) t
      pivot (
            -- ??
      ) p
  ) tbl

谁能帮我完成这个查询/解释我旋转?非常感谢任何帮助。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    你想要的是 UNPIVOT 并这样做:

    select id,field,value from
    #document_fields
    unpivot
    (
     value
     for field in (x,y,z)
    ) as u
    order by id,field
    

    Demo

    【讨论】:

    • 谢谢!但是我收到一个错误:列“y”的类型与 UNPIVOT 列表中指定的其他列的类型冲突。我在另一个线程中读到这是因为所有列都必须具有相同的数据类型和长度。在这个例子中,有没有一种快速的方法来遍历列(x、y 和 z,但正如所说的可能还有数百个)并将它们全部转换为相同的数据日期和长度?
    • 我不知道。但是,我很好奇为什么您的表格中会有这种结构。我的意思是你不应该在一个列中包含文本和数字,对吧?还是我错过了一些简单的东西?
    • 是的,真的很简单 :) 客户想要这种格式的数据转储,以便在 excel 中轻松过滤。所以这个脚本只是生成那个excel。当然,实际上所有内容都按应有的方式存储:)
    【解决方案2】:
    DECLARE @Component table (ComponentId INT,Descr VARCHAR(10),Descr1 VARCHAR(10),Descr2 VARCHAR(10))
    INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (1,'foo','bar','baz')
    INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (2,'one','two','three')
    INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (3,'aaa','bbb','ccc')
    INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (3,'123','456','789')
    
    
       select
          ComponentId,Field
       from @Component P
    
     UNPIVOT
     (
       Field
       FOR Value
       IN (
        [Descr],[Descr1],[Descr2]
       )
     ) PivotTable;
    

    【讨论】:

    • 谢谢!我得到一个错误:The type of column "y" conflicts with the type of other columns specified in the UNPIVOT list。我在另一个线程中读到这是因为所有列都必须具有相同的数据类型和长度。在这个例子中,有没有一种快速的方法来遍历列(x、y 和 z,但正如所说的可能还有数百个)并将它们全部转换为相同的数据日期和长度?
    • convert 或 cast 有意义。根据您提供的示例数据,我编写了查询..根据您的要求进行修改
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2018-04-15
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多