SQL表转换 - 列stat

时间:2017-03-03 19:50:46

标签: sql tsql grouping transformation aggregation

让我们想象一下:

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;

问题是:我可以使用哪种智能机制来手动列出案例,如果有很多案例?

2 个答案:

答案 0 :(得分:2)

如果你需要去DYNAMIC

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

答案 1 :(得分: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;