2012-11-28 50 views
1

这是我的表格,用于追踪员工休息日。这个例子只适用于一个人。将查询结果合并为一个

ID PID  Year  OffDays  DayTypeNumber 
------------------------------------------ 
1  1  2011  10   1 
2  1  2011  5    2 
3  1  2012  20   1 
4  1  2012  3    2 

我想写出这样一个查询,应仅显示一个结果每年额外列

Year  OffDays(1) OffDays(2) 
------------------------------------------ 
2011  10   5 
2012  20   3 

回答

3

您可以使用此PIVOT功能:

select year, 
    [1] [OffDays(1)], 
    [2] [OffDays(2)] 
from 
(
    select year, offdays, daytypenumber 
    from yourtable 
) src 
pivot 
(
    sum(offdays) 
    for daytypenumber in([1], [2]) 
) piv 

请参见SQL Fiddle with Demo

结果:

| YEAR | OFFDAYS(1) | OFFDAYS(2) | 
---------------------------------- 
| 2011 |   10 |   5 | 
| 2012 |   20 |   3 | 

或者你可以使用聚合函数与CASE声明:

select year, 
    sum(case when daytypenumber = 1 then offdays end) [OffDays(1)], 
    sum(case when daytypenumber = 2 then offdays end) [OffDays(2)] 
from yourtable 
group by year 

SQL Fiddle with Demo

如果你只有两种类型的您要比较,那么你可以使用子查询:

select t1.year, 
    [OffDays(1)], 
    [OffDays(2)] 
from 
(
    select sum(offdays) [OffDays(1)], year 
    from yourtable 
    where daytypenumber = 1 
    group by year 
) t1 
left join 
(
    select sum(offdays) [OffDays(2)], year 
    from yourtable 
    where daytypenumber = 2 
    group by year 
) t2 
    on t1.year = t2.year 

请参阅SQL Fiddle with Demo

以上的答案会是不错的,如果你有一个已知的数值为DayTypeNumber,但如果这些都是未知的,那么你可以使用动态SQL生成PIVOT

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(DayTypeNumber) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colNames = STUFF((SELECT distinct ', ' + QUOTENAME(DayTypeNumber) 
         +' as [OffDays('+cast(DayTypeNumber as varchar(10))+')]' 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT year,' + @colNames + ' from 
      (
       select year, offdays, daytypenumber 
       from yourtable 
      ) x 
      pivot 
      (
       sum(offdays) 
       for daytypenumber in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

所有这些将产生相同的结果:

| YEAR | OFFDAYS(1) | OFFDAYS(2) | 
---------------------------------- 
| 2011 |   10 |   5 | 
| 2012 |   20 |   3 | 
+1

你是如何在7,8分钟内用小提琴完成的?惊人的速度.. – Kaf

+0

我知道(并希望)你会在一段时间内给予动态查询[像这样](http://dba.stackexchange.com/a/27669/9332) – hims056

+1

@卡夫 - 这是SQLFiddle和[bluefeet]的知识(http://stackoverflow.com/users/426671/bluefeet?tab=answers&sort=votes)。 :) – hims056