SQL查询;水平到垂直

Posted

技术标签:

【中文标题】SQL查询;水平到垂直【英文标题】:SQL query ; horizontal to vertical 【发布时间】:2012-09-19 19:44:03 【问题描述】:

我遇到了一个涉及将水平行转换为垂直行的 SQL 查询 (SQL Server)

以下是我的数据

No      Flag_1    Flag_2    Flag_3
---      ----      -----     -----
A         1         2         3
B         4         1         6

转换后的表格应该是

No     FlagsName    Flag_value
--      ----        ----------
A        Flag_1        1
A        Flag_2        2  
A        Flag_3        3
B        Flag_1        4
B        Flag_2        1
B        Flag_3        6

对此有何帮助?

我正在尝试在分区上玩ROW_NUMBER。但它不工作!!!

谢谢!!!

【问题讨论】:

【参考方案1】:

您可以使用UNION ALL

select No, 'Flag_1' as FlagName, Flag_1 as Flag_Value
from yourtable
union all
select No, 'Flag_2' as FlagName, Flag_2 as Flag_Value
from yourtable
union all
select No, 'Flag_3' as FlagName, Flag_3 as Flag_Value
from yourtable

或者UNPIVOT

select no, FlagsName, flag_value
from yourtable
unpivot
(
    flag_value
    for FlagsName in (Flag_1, Flag_2, Flag_3)
) u

见SQL Fiddle With Demo

【讨论】:

我喜欢使用 UNPIVOT,因为它读起来更好,也更简洁。那么,它们在性能方面如何比较?

以上是关于SQL查询;水平到垂直的主要内容,如果未能解决你的问题,请参考以下文章

带有大小写的Oracle SQL查询垂直到水平[重复]

用SQL查询创建水平垂直直方图

Sql Pivot:垂直显示字段

SQL Server Management Studio中的垂直选项卡 - 并排查询和结果?

翻译——T-SQL的进阶之路:超过基础的2级水平:写子查询

SQL Server 2005 中的水平到垂直表转换