2017-08-24 100 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

我的解决方案是创建第二个记录集,每周只有一个每周总记录,然后从该范围取平均值,而不是用于报告详细部分的记录集。