集团总计平均值 i Reporting Services 2012

Average on group totals i Reporting Services 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        |
+-------+---------+-----------+-----------+

只应计算周总数的平均值。 IE。对于产品 A,平均值应为 (550+600)/2=575.

我的平均值公式如下所示:

=Avg(Fields!WeekTotal.Value)

然而,这给出了错误的结果 - 我的猜测是它也考虑了天数?

这个问题变得更难了,因为有时我没有天数销售,在这种情况下,WeekTotal 将是一个预测

我的数据集来自 SQL 服务器 table,包含以下数据:

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

感谢任何帮助!

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

您可以简单地将所有详细信息值(在天级别)相加,然后除以唯一周数。像这样...

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

在你的样本中 CountDistinct(Fields!Week.Value) 将 return 2

这一切都假设您有一个简单的矩阵作为您的报表设计...

表达式就是上面计算平均值的表达式

请注意,在我的示例数据中,我有更多详细信息,因此我按天和周分组。在你的情况下你不需要按天分组(但如果你这样做它仍然有效)

此外,您不需要周总计,因为您可以简单地在周组级别对天总计求和。

根据 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

请注意,我现在 return 一个额外的列 WeekTotalAverage(我知道,可怜的名字!)。这样做的目的是为我们提供每周总计 product/week 的平均值,然后我们可以用该字段简单地替换前一个表达式中的总计天数。数据集输出如下所示。

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 经常性。

报告设计也有一点变化。现在看起来像这样。

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

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

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

分组