sql - 如何将列变成行

标签 sql sql-server tsql sql-server-2008 pivot

如果我有一个看起来像这样的表:

    ID int
    Name varchar
    City1 varchar
    City2 varchar
    City3 varchar
    State1 varchar
    State2 varchar
    State3 varchar

我理解正常的 SELECT 语句会返回如下数据:

    ID, Name, City1, City2, City3, State1, State2, State3

但是我如何返回 SELECT 语句以将多个城市/州返回到不同的行中,并将它们分组......所以它看起来像这样:

    ID, Name, City, State

而不是这些列:Color1、Color2、Color3 和 State1、State2、State3

如果 1,2,3 不为空,它们将只是 SELECT 语句中的更多行,其中所有其他数据保持不变。

关于如何使用最少的代码来解决这个问题有什么建议吗?最好是一个 SELECT 语句来处理这一切?

最佳答案

您可以查询您的表三次并使用union all 合并结果。

select ID, Name, City1 as City, State1 as State
from YourTable
union all
select ID, Name, City2, State2
from YourTable
union all
select ID, Name, City3, State3
from YourTable

您也可以使用交叉连接和几个 case 语句在一个查询中执行此操作。

select ID, 
       Name,
       case T.N 
         when 1 then City1
         when 2 then City2
         when 3 then City3
       end as City,
       case T.N 
         when 1 then State1
         when 2 then State2
         when 3 then State3
       end as State
from YourTable
  cross join (values(1),(2),(3)) as T(N)

关于sql - 如何将列变成行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701404/

相关文章:

mysql - 替换mysql中的数字

sql - 是否可以动态提供 sp_ExecuteSql 参数名称?

sql - 在数据库中创建表时向管理员发送邮件?

sql-server - 是用#TEMP表的替代品吗?

sql - 为什么 Oracle 不因缺少 GROUP BY 子句而抛出错误消息?

MySQL查询共同好友

sql - 多种内容类型的评论表的最佳解决方案

SQL执行计划显示 "Actual Number of Rows",大于表大小

c# - 使用C#和存储过程从sql数据库中检索数据

asp.net - 从Docker容器到主机中SQL Server dblocal的连接字符串