2017-03-03 32 views
1

讓我們想象一下觀點:SQL表改造 - 列STAT

enter image description here

,我想改變它優雅的方式,爲類似如下:

enter image description here

我請使用以下查詢:

SELECT empid, 
    sum(CASE WHEN YEAR(ordermonth) = '2014' THEN val END) '2014', 
    sum(CASE WHEN YEAR(ordermonth) = '2015' THEN val END) '2015', 
    sum(CASE WHEN YEAR(ordermonth) = '2016' THEN val END) '2016' 
FROM Sales.EmpOrders 
GROUP BY empid; 

問題是:我可以使用什麼智能機制來避免手動列出案例,如果它們中有很多?

+0

你將不得不使用動態SQL和代碼會更加混亂。 –

+0

動態SQL。 。 。 – GurV

+0

我聽說,使用CTE,加入操作,也許支點是可能的,但我可能是錯的。 –

回答

1

如果喲需要去動態

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Year(ordermonth)) From sales.emporders Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [empid],' + @SQL + ' 
From (
     Select empid 
       ,item = year(ordermonth) 
       ,value = val 
     From sales.emporders A 
    ) A 
Pivot (sum(value) For [item] in (' + @SQL + ')) p' 
Exec(@SQL); 
+0

這樣會更快地用'years'表加入而不是使用'year()',但這可能太多了。像這樣:http://rextester.com/UHUV4630 – SqlZim

+0

@SqlZim同意,但年()是一個快速的計算。也就是說,我更喜歡像你演示的那樣有條件的聚合。我只是不想編寫條件聚合的動態sql。上面的語法很容易消化和支持。 –

+0

我同意,這就是爲什麼我upvoted。 – SqlZim

1

這不回答你的問題,但你可以讓你的查詢更高效的通過不使用year()功能:

select empid, 
    sum(case when ordermonth >= '20140101' and ordermonth < '20150101' then val end) '2014', 
    sum(case when ordermonth >= '20150101' and ordermonth < '20160101' then val end) '2015', 
    sum(case when ordermonth >= '20160101' and ordermonth < '20170101' then val end) '2016' 
from sales.emporders 
group by empid;