【问题标题】:UNPIVOT Table ColumnsUNPIVOT 表列
【发布时间】:2018-04-22 18:48:33
【问题描述】:

我想以行而不是列的形式获取表格数据。

动态读取列名。

视觉示例:

ColA    ColB    ColC    ColD
1       2       3       4

到这里:

ColA    1
ColB    2
ColC    3
ColD    4

【问题讨论】:

    标签: sql sql-server sql-server-2012 unpivot


    【解决方案1】:

    这种方法将“动态地”对您的数据进行反透视,而无需实际使用动态 SQL 或指定所有字段名称。

    完全披露: Gordon 的方法当然更高效。

    示例

    Select C.*
     From  YourTable A
     Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
     Cross Apply (
                    Select Item  = a.value('local-name(.)','varchar(100)')
                          ,Value = a.value('.','varchar(max)') 
                     From  B.XMLData.nodes('/row')  as C1(n)
                     Cross Apply C1.n.nodes('./@*') as C2(a)
                     Where a.value('local-name(.)','varchar(100)') not in ('Colums','To_Exclude')
                 ) C
    

    退货

    Item    Value
    ColA    1
    ColB    2
    ColC    3
    ColD    4
    

    【讨论】:

      【解决方案2】:

      我的首选方法是apply:

      select v.*
      from t cross apply
           (values ('colA', t.colA), ('colB', t.colb), ('colC', t.colc), ('colD', t.cold)
           ) v(which, val);
      

      从技术上讲,apply 实现了横向连接。这是非常强大的; unpivot 只是它可以完成的许多事情之一。但是,unpivot 是开始了解 apply 的好方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-10
        • 2021-12-30
        • 2018-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多