2011-10-09 61 views
2

如果我有一个表,看起来像这样:如何将列转换为行

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语句?

+0

可能重复[SQL服务器?我可以用逗号分隔多行合并到一列(http://stackoverflow.com/questions/2046037/sql-server-can-i-comma-delimit-multiple -row-into-one-column) –

回答

6

您可以查询您的表三次并使用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) 
+0

何时不只是null? –

+0

@ZeeTee - 如果你不想要空值,你应该添加一个where子句。 'City1不为空'等。 –

+0

@ZeeTee - 不确定我是否理解如何排除非空值。例如,如果City2中的某一行有空值,那么您是否还想为该行包含城市1和城市3? –