2017-08-24 96 views
1

我試圖用tablix在SQL Server Reporting Services 2012中的組總計中計算平均值。平均組數總計i Reporting Services 2012

似乎是這個問題與struggeling同樣的問題......但是有沒有響應:SQL 2005 Reporting Services - Wrong Average Values

我的表矩陣如下所示:

+-------+---------+-----------+-----------+ 
|  |   | Product A | Product B | 
+-------+---------+-----------+-----------+ 
|  | Average |  ??? | ???  | 
|  |   |   |   | 
| Week1 |   |  550 | 175  | 
|  | Day 1 |  250 | 100  | 
|  | Day 2 |  200 | 50  | 
|  | Day 3 |  100 | 25  | 
|  |   |   |   | 
| Week2 |   |  600 | 240  | 
|  | Day 1 |  300 | 200  | 
|  | Day 2 |   | 30  | 
|  | Day 3 |   | 10  | 
+-------+---------+-----------+-----------+ 

平均只應計算爲周總數。即對於產品A,平均值應該是(550 + 600)/ 2 = 575。

我的公式平均如下所示:

=Avg(Fields!WeekTotal.Value) 

然而,這給出了一個錯誤的結果 - 我的猜測是,它需要幾天考慮藏漢?

的問題變得更難,因爲有時我沒有天銷售,在這種情況下WeekTotal將是一個預測

我的數據集,其中來自SQL Server表,包含以下數據:

+---------+------+-----+-----------+----------+ 
| Product | Week | Day | WeekTotal | DayTotal | 
+---------+------+-----+-----------+----------+ 
| A  | 1 | 1 | 550  | 250  | 
| A  | 1 | 2 | 550  | 200  | 
| A  | 1 | 3 | 550  | 100  | 
| B  | 1 | 1 | 175  | 100  | 
| B  | 1 | 2 | 175  | 50  | 
| B  | 1 | 3 | 175  | 25  | 
| A  | 2 | 1 | 600  | 300  | 
| A  | 2 | 2 | 600  | NULL  | 
| A  | 2 | 3 | 600  | NULL  | 
| …  | … | … | …   | …  | 
+---------+------+-----+-----------+----------+ 

任何幫助表示讚賞!

回答

3

您可以簡單地總結所有的細節值(在日級),然後除以獨特週數。事情是這樣的......

=Sum(Fields!DayTotal.Value)/CountDistinct(Fields!Week.Value) 

在你的樣品CountDistinct(Fields!Week.Value)將返回2

這一切都假定你有一個簡單的矩陣作爲報表的設計是這樣的......

enter image description here

表達式是上面的表達式來計算平均值。

請注意,在我的示例數據中,我有更多的細節,所以我按日和周分組。在你的情況下,你不需要按天分組(但它仍然可以工作,如果你這樣做)

此外,你不需要一週的總數,因爲你可以簡單地總結一週周組的總數。

更新基於OP評論:

當您需要使用您的數據的實際星期總數(這並不總是正如我以前所認爲的日子總數的總和),我們將不得不編輯數據集並在那裏做一些工作。 下面是用於生成示例數據集的代碼。

DECLARE @t TABLE (Product varchar(1), [Week] int, [Day] int, WeekTotal int, DayTotal[int]) 
INSERT INTO @t                         
VALUES   
('A', 1, 1, 550, 250), 
('A', 1, 2, 550, 200), 
('A', 1, 3, 550, 100), 
('B', 1, 1, 175, 100), 
('B', 1, 2, 175, 50), 
('B', 1, 3, 175, 25), 
('A', 2, 1, 600, 300), 
('A', 2, 2, 600, NULL), 
('A', 2, 3, 600, NULL) 

SELECT 
    * 
    , CAST(WeekTotal as float)/COUNT(*) OVER(PARTITION BY Product, [Week]) as WeekTotalAverage 
FROM @t 

請注意,我現在返回一個額外的列WeekTotalAverage(我知道,可憐的名字!)。這樣做會給我們每週產品的平均週數,然後我們可以簡單地用此字段替換之前表達式中的日總數。數據集輸出如下所示。

Product Week Day WeekTotal DayTotal WeekTotalAverage 
A  1  1 550   250   183.333333333333 
A  1  2 550   200   183.333333333333 
A  1  3 550   100   183.333333333333 
A  2  1 600   300   200 
A  2  2 600   NULL  200 
A  2  3 600   NULL  200 
B  1  1 175   100   58.3333333333333 
B  1  2 175   50   58.3333333333333 
B  1  3 175   25   58.3333333333333 

我已經把結果此列的爲float或者我們最終輸掉了數字的分數時,結果再次發生。因此,在這種情況下,產品B的第一週有三個條目,所以我們將總週數(165)除以3再給出58.33。

報表設計也有所變化。它現在看起來像這樣。

enter image description here

現在的周總只是[WeekTotal](以前是[SUM(DayTotal)])和平均表達式爲現在..

=Sum(Fields!WeekTotalAverage.Value)/CountDistinct(Fields!Week.Value) 

在矩陣中,有兩個行組,所述第一組由Week和第二組(子組)組成Day。列組分爲Product

+0

嗨艾倫。感謝您的回覆..我認爲這是正確的方式,但是我忘記提及有時我沒有DayTotal,這意味着WeekTotal是預測。 因此,如果我將DayTotal的SUM數據存儲在只有WeekTotals的星期幾,我已經更新了我的問題....你有關於如何解決這個問題的想法嗎?提前致謝! – Tiawy

+0

我已經更新了答案(我已經將舊答案留下了,所以向下滾動) –

0

我的解決方案是創建第二個記錄集,每週只有一個每週總記錄,然後從該範圍取平均值,而不是用於報告詳細部分的記錄集。