使用SQL Server将列转换为行

使用SQL Server将列转换为行,sql,sql-server-2008,row,transpose,Sql,Sql Server 2008,Row,Transpose,你能帮我拿一个箱子吗 我有一张原始的桌子,像这样: MONTH | YEAR | PO1 | PO2 | PO3 +++++++++++++++++++++++++++++++++++++++++ 01 2010 100 20 10 DESCRIPTION | VALUE +++++++++++++++++++++++++++++++++++++++++ PO1 100 PO2 20 PO3

你能帮我拿一个箱子吗

我有一张原始的桌子,像这样:


MONTH | YEAR | PO1 | PO2 | PO3

+++++++++++++++++++++++++++++++++++++++++

01      2010   100    20    10


DESCRIPTION | VALUE 
+++++++++++++++++++++++++++++++++++++++++
PO1            100
PO2             20
PO3             10
那么我想要的结果是这样的:


MONTH | YEAR | PO1 | PO2 | PO3

+++++++++++++++++++++++++++++++++++++++++

01      2010   100    20    10


DESCRIPTION | VALUE 
+++++++++++++++++++++++++++++++++++++++++
PO1            100
PO2             20
PO3             10
我应该如何在SQL Server中执行此操作,非常感谢您的帮助。

您可以使用此函数将列转换为行:

create table #test
(month int,year int,po1 int,po2 int ,po3 int)

insert into #test 
values
(5,2013,100,20,10)

select
  Description,
  value
from #test
unpivot
(
  value
  for Description in (po1, po2, po3)
) unpiv;

drop table #test
如果有多个列要
unpivot
,则可以使用动态sql使用
sql语句:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.column_name)
           from information_schema.columns as C
           where C.table_name = 'yourtable' and
                 C.column_name like 'PO%'
           for xml path('')), 1, 1, '')

set @query 
  = 'select 
       Description,
       value
     from yourtable
     unpivot
     (
        value
        for Description in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

非常感谢你。我真的很感激。是的,动态sql查询就是从这个答案得到的。