SQL table 转换 - 列统计

SQL table transformation - columns stat

让我们想象一下视图:

我想以优雅的方式将其转换为如下所示:

我正在使用以下查询来做到这一点:

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;

问题是:如果案例很多,我可以使用什么智能机制来避免手动列出案例?

这没有回答您的问题,但您可以通过不使用 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;

如果你需要动态

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);