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);
让我们想象一下视图:
我想以优雅的方式将其转换为如下所示:
我正在使用以下查询来做到这一点:
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);