如何在sql server中将列转换为行

Posted

技术标签:

【中文标题】如何在sql server中将列转换为行【英文标题】:How to convert columns to rows in 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  
...

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

【问题讨论】:

【参考方案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】:

Pivot & UnPivot 将解决这个问题 :)

点击链接:

http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于如何在sql server中将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyspark中将列转换为行?

在SQL中将列转换为行

在 ORACLE SQL 中将一组列转换为行

仅当其中一列 = 1 时,如何将列转换为行?

SQL Server 2008 R2 - 将列转换为行并将所有值放在一列中

SQL Server:将列转换为行