2012-11-28 213 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