2011-10-09 111 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? –