报告服务2012的小组总数的平均值

时间:2017-08-24 12:55:43

标签: reporting-services ssrs-2012

我正在尝试使用Tablix对SQL Server Reporting Services 2012中的组总数进行平均分析。

似乎是这个问题与之相关的问题......但是没有回复:SQL 2005 Reporting Services - Wrong Average Values

我的tablix如下所示:

+-------+---------+-----------+-----------+
|       |         | 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     |
| …       | …    | …   | …         | …        |
+---------+------+-----+-----------+----------+

感谢任何帮助!

2 个答案:

答案 0 :(得分: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(我知道,名字很差!)。这样做是为了给我们平均每周产品/周的总数,然后我们可以用这个字段简单地替换前一个表达式中的daytotal。数据集输出如下所示。

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

我已将此列的结果转换为浮点数,或者当结果重复出现时,我们最终会丢失数字的一部分。因此,在这种情况下,产品B第1周有三个条目,因此我们将总周数(165)除以3得到58.33重复出现。

报告设计也有所改变。它现在看起来像这样。

enter image description here

周总数现在只有[WeekTotal](以前是[SUM(DayTotal)]),现在是平均值的表达式。

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

在矩阵中,有两个行组,第一组由Week组成,第二组(子组)按Day分组。列组分组在Product

答案 1 :(得分:0)

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