5

我有一个 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

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

4

5 回答 5

6

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

这是一个带有示例的 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)

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

于 2012-05-23T18:32:29.273 回答
3

在 msdn 上做 red this使用 PIVOT 和 UNPIVOT这将很容易解决问题..

SQL SERVER – PIVOT 和 UNPIVOT 表示例

于 2012-05-23T07:05:36.337 回答
0

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

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

湾。你应该做一些逻辑来把列变成行和 vs。

于 2012-05-23T07:13:12.377 回答
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
于 2012-05-23T08:10:34.120 回答
-1
select sum("Total Hours") as "Total Hours", Year 
from tablename 
group by Year

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

于 2012-05-23T07:40:38.840 回答