如何在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中将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章