从SQL Server中的行创建列

xor*_*wer 5 sql sql-server sql-server-2008

我有一个SQL查询,它以以下格式带来数据;

Total Hours   Year   
  100.00      2012 
  200.00      2012 
  300.00      2012 
   75.00      2011 
  150.00      2011 
   50.00      2010 
  125.00      2010 
Run Code Online (Sandbox Code Playgroud)

我需要对总小时数求和并将结果集作为;

2012   2011  2010
 600    225   175
Run Code Online (Sandbox Code Playgroud)

请在这里帮助我!如果您需要更多信息,请与我们联系。

Tar*_*ryn 5

您可以使用PIVOT执行此操作,可以是对年份进行硬编码的静态PIVOT,也可以是运行查询时在其中创建年份列表的动态PIVOT:

静态PIVOT:

create table table1
(
  totalhours decimal(10, 2),
  year int
)

insert into table1 values(100, 2012)
insert into table1 values(200, 2012)
insert into table1 values(300, 2012)
insert into table1 values(75, 2011)
insert into table1 values(150, 2011)
insert into table1 values(50, 2010)
insert into table1 values(125, 2010)

select *
from
(
  select *
  from table1
) x
pivot
(
  sum(totalhours)
  for year in ([2012], [2011], [2010])
) p
Run Code Online (Sandbox Code Playgroud)

这是一个带有示例的SQL Fiddle

动态枢轴:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.year) 
            FROM table1 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
            (
                select totalhours, year
                from table1
           ) x
            pivot 
            (
                 sum(totalhours)
                for year in (' + @cols + ')
            ) p '


execute(@query)
Run Code Online (Sandbox Code Playgroud)

两者都会给您相同的结果。


Pra*_*ana 3

在 msdn 上执行红色操作使用 PIVOT 和 UNPIVOT这将轻松解决问题。

\n\n

SQL SERVER \xe2\x80\x93 PIVOT 和 UNPIVOT 表示例

\n