如何将列转换为行

时间:2011-10-09 04:09:05

标签: 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语句以将多个City / State返回到不同的行,并将它们分组......所以它看起来像这样:

    ID, Name, City, State

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

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

有关如何使用最少量的代码处理此问题的任何建议?最好是一个处理这一切的SELECT语句吗?

1 个答案:

答案 0 :(得分: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

您也可以使用交叉连接和几个案例陈述在一个查询中执行此操作。

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)