2017-10-13 91 views
0

我们的一位经理要求提供具有特定格式的报告,其中员工姓名为行,一年中的月份为列,每个员工平均每月收入填充单元格。日期最终将被替换为@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的平均值计算不正确?感谢您的帮助。

+0

您是否有一个报告工具,您将使用(如果是这样,它应该处理数据透视表)或者您只是计划在数据库中运行此查询并将结果复制到Excel或某些内容(并且Excel可以做一个主要太)? – thomas

+0

嗨托马斯。我们使用Visual Studio来构建我们的报告,因此基本上将查询复制并粘贴到构建向导中。我真的不知道这样的操作是否会进行,但它是一个好点,我会研究它。 – Greg

+0

然后你可能在Visual Studio中使用SSRS。查看Tablix功能(表格,列表,矩阵)。一个矩阵可以为您提供原始数据(您甚至不会提供预先计算的平均值,只是原始的“总值”字段),然后让您的报告工具为您汇总所有内容。当你最终添加你的开始和结束参数时,还应该使它更容易和更动态。 – thomas

回答

1

尝试从您的透视查询中删除此行。看起来你没有理由分组。

group by name AS Employee, s.gross, s.SYSTEMMONTH, s.SYSTEMYEAR 

你也可以采取对您的第一个查询和数据透视和数据透视汇总会成为MAXMIN在这一点上,因为你只会曾经有1行中的数据集中为每个员工/月组合。

+0

优秀的电话托马斯!这解决了问题。我甚至没有想到在我的原始查询中需要删除它。非常感谢您的帮助! – Greg