Reporting services 2012年报告服务集团总计平均值

Reporting services 2012年报告服务集团总计平均值,reporting-services,ssrs-2012,Reporting Services,Ssrs 2012,我正在尝试使用tablix对SQL Server Reporting Services 2012中的组总数进行平均 似乎是这个问题所面临的同一个问题……但是没有回答: 我的tablix如下所示: +-------+---------+-----------+-----------+ | | | Product A | Product B | +-------+---------+-----------+-----------+ | | Average |

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

似乎是这个问题所面临的同一个问题……但是没有回答:

我的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        |
+-------+---------+-----------+-----------+
=Avg(Fields!WeekTotal.Value)
平均值应仅针对周总数进行计算。即,对于产品A,平均值应为(550+600)/2=575

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

+-------+---------+-----------+-----------+
|       |         | 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        |
+-------+---------+-----------+-----------+
=Avg(Fields!WeekTotal.Value)
然而,这给出了一个错误的结果——我的猜测是它也考虑了天数

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

“我的数据集”来自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     |
| …       | …    | …   | …         | …        |
+---------+------+-----+-----------+----------+

感谢您的帮助

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

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

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

=Sum(Fields!DayTotal.Value)/CountDistinct(Fields!Week.Value)
在您的示例中,
CountDistinct(Fields!Week.Value)
将返回
2

这一切都假设你有一个简单的矩阵作为你的报告设计像这样的东西

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

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

请注意,在我的样本数据中,我有更多的细节,因此我按天和周进行分组。在你的情况下,你没有;不需要按天分组(但如果你这样做,它仍然有效)

此外,您不需要周总数,因为您可以简单地在周组级别对日总数进行求和

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

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

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

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

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

在矩阵中,有两个行组,第一组按
分组,第二组(子组)按
分组。列组在
产品上分组

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

=Sum(Fields!DayTotal.Value)/CountDistinct(Fields!Week.Value)
在您的示例中,
CountDistinct(Fields!Week.Value)
将返回
2

这一切都假设你有一个简单的矩阵作为你的报告设计像这样的东西

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

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

请注意,在我的样本数据中,我有更多的细节,因此我按天和周进行分组。在你的情况下,你没有;不需要按天分组(但如果你这样做,它仍然有效)

此外,您不需要周总数,因为您可以简单地在周组级别对日总数进行求和

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

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

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

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

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

在矩阵中,有两个行组,第一组按
分组,第二组(子组)按
分组。列组在
产品上分组

Hi-Alan。谢谢你的回复。。我认为这是正确的做法,但我忘了提到,有时我没有一天的总数,这意味着一周的总数是一个预测。因此,如果我计算DayTotal的总和,我将丢失只有周总数的几周的数据。我已经更新了我的问题…你有办法解决这个问题吗?提前谢谢!我已经更新了答案(我也保留了旧答案,所以向下滚动)嗨,艾伦。谢谢你的回复。。我认为这是正确的做法,但我忘了提到,有时我没有一天的总数,这意味着一周的总数是一个预测。因此,如果我计算DayTotal的总和,我将丢失只有周总数的几周的数据。我已经更新了我的问题…你有什么建议吗