我们的一位经理要求提供具有特定格式的报告,其中员工姓名为行,一年中的月份为列,每个员工平均每月收入填充单元格。日期最终将被替换为@startdate和@enddate变量,但为了构建和测试,我已经硬编码了一个日历年。为了完成这个请求,我创建了一个PIVOT查询,但是我的结果集是不正确的,而且我很少使用PIVOT查询,所以我没有足够的知识来理解这个问题,并且我希望经常使用它们的人有一些帮助。在PIVOT中正确导出平均值
首先,这里是我的查询拉正确的结果集,而不要求的格式:
select d.Name, AVG(gross), s.systemmonth, s.SYSTEMYEAR
from desk d, PAYMENTS s
where d.code = s.DESK
and s.ENTERED between '2017-08-01' and '2017-09-30'
group by name, s.SYSTEMMONTH, s.SYSTEMYEAR
order by name
结果集的几行:
Name (No column name) systemmonth SYSTEMYEAR
employee 1 221.5737 8 2017
employee 1 181.2476 9 2017
employee 2 161.62 9 2017
employee 2 321.9311 8 2017
employee 3 249.2245 9 2017
employee 4 328.1208 8 2017
employee 4 198.6748 9 2017
employee 5 76.4833 8 2017
employee 5 96.6896 9 2017
现在对于我的PIVOT查询:
select name, [1] AS January, [2] AS February, [3] AS March, [4] AS April,
[5] AS May, [6] AS June, [7] AS July, [8] AS August, [9] AS September, [10]
AS October, [11] AS November, [12] AS December
from
(select d.Name, s.gross, s.systemmonth, s.SYSTEMYEAR
from desk d, PAYMENTS s
where d.code = s.DESK
and s.ENTERED between '2017-01-01' and '2017-12-31'
group by name AS Employee, s.gross, s.SYSTEMMONTH, s.SYSTEMYEAR) a
PIVOT
(AVG(gross)
FOR systemmonth IN
([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) AS pvt
order by name
伴随的结果,平均值都是不正确的(但NULL是正确的)。我刚刚包括2个月,便于阅读和比较:
Employee August September
employee 1 279.501 245.478
employee 2 544.9648 235.9713
employee 3 NULL 312.5366
employee 4 403.1505 273.9044
employee 5 129.8883 239.8701
有谁能告诉我为什么PIVOT的平均值计算不正确?感谢您的帮助。
您是否有一个报告工具,您将使用(如果是这样,它应该处理数据透视表)或者您只是计划在数据库中运行此查询并将结果复制到Excel或某些内容(并且Excel可以做一个主要太)? – thomas
嗨托马斯。我们使用Visual Studio来构建我们的报告,因此基本上将查询复制并粘贴到构建向导中。我真的不知道这样的操作是否会进行,但它是一个好点,我会研究它。 – Greg
然后你可能在Visual Studio中使用SSRS。查看Tablix功能(表格,列表,矩阵)。一个矩阵可以为您提供原始数据(您甚至不会提供预先计算的平均值,只是原始的“总值”字段),然后让您的报告工具为您汇总所有内容。当你最终添加你的开始和结束参数时,还应该使它更容易和更动态。 – thomas