【问题标题】:How to convert columns to rows in sql server如何在sql server中将列转换为行
【发布时间】:2012-07-04 05:43:14
【问题描述】:

请考虑这张表:

ID         Page          Line           C01          C02          C03        
---------------------------------------------------------------------
1          122            11             1            0            1
1          123            11             1            1            1
1          124            12             0            0            0
1          125            16             1            0            1
1          127            11             0            1            0

我想把这张表转换成这张:

ID         Page          Line           City         Value
-----------------------------------------------------------
1          122            11            C01            1           
1          122            11            C02            0  
1          122            11            C03            1  
1          123            11            C01            1  
1          123            11            C02            1  
1          123            11            C03            1  
...

我怎样才能以适当的方式做到这一点?

【问题讨论】:

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


    【解决方案1】:

    使用 UNPIVOT。尝试类似:

    SELECT ID, Page, Line, City, Value
    FROM SourceTable
    UNPIVOT
       (Value FOR City IN 
          (C01, C02, C03)
    )AS unpvt;
    

    其中“SourceTable”是您的源表名称。 (注意:我目前无法对此进行测试,因此可能并不完全正确。)

    这里有完整的细节:http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

    【讨论】:

      【解决方案2】:

      以下查询应该满足您的要求。

      SELECT ID, PAGE, LINE, "C01", C01 FROM TABLE
      UNION 
      SELECT ID, PAGE, LINE, "C02", C02 FROM TABLE
      UNION
      SELECT ID, PAGE, LINE, "C03", C03 FROM TABLE
      

      【讨论】:

      • 我想这个想法通常必须很清楚,但是:1)在Transact-SQL中,双引号用于分隔名称(默认情况下,无论如何)。为了分隔字符串常量,使用 引号。 2) UNION 删除重复的行。即使不太可能出现重复(如在本例中),查询计划仍可能包括删除它们的步骤,这很可能会影响性能。请改用 UNION ALL。 3) 应该为最后两列提供别名。
      • 感谢 Andriy 的澄清。欣赏它。
      【解决方案3】:
      【解决方案4】:

      您可以通过在 Linq to sql 中执行类似的操作来实现此目的

      Is Unpivot (Not Pivot) functionality available in Linq to SQL? How?

      【讨论】:

        【解决方案5】:

        执行自连接,每 1+N 列一次。并创建一个笛卡尔表。

        自连接是将同一个表连接到自身。按 id、page 和 line 匹配。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-04
          • 1970-01-01
          • 2019-07-16
          • 1970-01-01
          • 2013-10-01
          • 1970-01-01
          相关资源
          最近更新 更多