我們的一位經理要求提供具有特定格式的報告,其中員工姓名爲行,一年中的月份爲列,每個員工平均每月收入填充單元格。日期最終將被替換爲@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