您可以使用此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 |
你是如何在7,8分鐘內用小提琴完成的?驚人的速度.. – Kaf
我知道(並希望)你會在一段時間內給予動態查詢[像這樣](http://dba.stackexchange.com/a/27669/9332) – hims056
@卡夫 - 這是SQLFiddle和[bluefeet]的知識(http://stackoverflow.com/users/426671/bluefeet?tab=answers&sort=votes)。 :) – hims056