从SQL Server中的行创建列

时间:2012-05-23 07:03:24

标签: 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 

我需要总计小时数并将结果集合为;

2012   2011  2010
 600    225   175

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

5 个答案:

答案 0 :(得分:4)

您可以使用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

Here is a SQL Fiddle with an example

Dynamic Pivot:

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)

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

答案 1 :(得分:3)

在msdn Using PIVOT and UNPIVOT上执行此操作,这样可以轻松解决问题..

SQL SERVER – PIVOT and UNPIVOT Table Examples

答案 2 :(得分:0)

一个。你可能会以某种方式得到这样的数据,但是这样做也许会有所帮助:

 select sum(p.TotalHours), p.Year From someTable p
    GROUP BY p.Year

湾你应该做一些逻辑来将列放入行和vs。

答案 3 :(得分:0)

您可以使用 sql分组 http://www.w3schools.com/sql/sql_groupby.asp

select 
    [Year], 
    SUM([Hours]) as HoursByYear
from 
    #table  
group by 
    [Year]

结果:

    Year    HoursByYear
    2010    175
    2011    225
    2012    600

pivot ,就像Pranay Rana建议的那样

select
    [2010], [2011], [2012]
from
    (select [YEAR], [Hours]
        from #table) AS SourceTable
    pivot
    (
        sum([Hours])
        for [Year] IN ([2010], [2011], [2012])
    ) as PivotTable

结果:

2010    2011    2012
175     225     600

答案 4 :(得分:-1)

select sum("Total Hours") as "Total Hours", Year 
from tablename 
group by Year

这个简单的查询将为您提供所需的输出。