Tia*_*awy 1 reporting-services ssrs-2012
我正在尝试使用 tablix 对 SQL Server Reporting Services 2012 中的组总数求平均值。
\n\n似乎是这个问题所苦苦挣扎的同一问题......但是没有回应:SQL 2005 Reporting Services - Wrong Average Values
\n\n我的 tablix 如下所示:
\n\n+-------+---------+-----------+-----------+\n| | | Product A | Product B |\n+-------+---------+-----------+-----------+\n| | Average | ??? | ??? |\n| | | | |\n| Week1 | | 550 | 175 |\n| | Day 1 | 250 | 100 |\n| | Day 2 | 200 | 50 |\n| | Day 3 | 100 | 25 |\n| | | | |\n| Week2 | | 600 | 240 |\n| | Day 1 | 300 | 200 |\n| | Day 2 | | 30 |\n| | Day 3 | | 10 |\n+-------+---------+-----------+-----------+\nRun Code Online (Sandbox Code Playgroud)\n\n平均值仅应计算每周总计。即对于产品 A,平均值应为 (550+600)/2=575。
\n\n我的平均值公式如下所示:
\n\n=Avg(Fields!WeekTotal.Value)\nRun Code Online (Sandbox Code Playgroud)\n\n然而这给出了错误的结果 - 我的猜测是它也考虑了天数?
\n\n这个问题变得更难,因为有时我没有天数销售,在这种情况下,WeekTotal 将是一个预测
\n\n我的数据集来自 SQL Server 表,包含以下数据:
\n\n+---------+------+-----+-----------+----------+\n| Product | Week | Day | WeekTotal | DayTotal |\n+---------+------+-----+-----------+----------+\n| A | 1 | 1 | 550 | 250 |\n| A | 1 | 2 | 550 | 200 |\n| A | 1 | 3 | 550 | 100 |\n| B | 1 | 1 | 175 | 100 |\n| B | 1 | 2 | 175 | 50 |\n| B | 1 | 3 | 175 | 25 |\n| A | 2 | 1 | 600 | 300 |\n| A | 2 | 2 | 600 | NULL |\n| A | 2 | 3 | 600 | NULL |\n| \xe2\x80\xa6 | \xe2\x80\xa6 | \xe2\x80\xa6 | \xe2\x80\xa6 | \xe2\x80\xa6 |\n+---------+------+-----+-----------+----------+\nRun Code Online (Sandbox Code Playgroud)\n\n任何帮助表示赞赏!
\n您可以简单地将所有详细值(在日级别)相加,然后除以唯一周数。像这样的东西...
=Sum(Fields!DayTotal.Value)/CountDistinct(Fields!Week.Value)
Run Code Online (Sandbox Code Playgroud)
在你的样本CountDistinct(Fields!Week.Value)中将返回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
Run Code Online (Sandbox Code Playgroud)
请注意,我现在返回一个额外的列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
Run Code Online (Sandbox Code Playgroud)
我已将此列的结果转换为浮点数,否则当结果重复出现时,我们最终会丢失数字的分数。因此,在本例中,产品 B 第 1 周有 3 个条目,因此我们将周总数 (165) 除以 3,得出重复的 58.33。
报告设计也发生了一些变化。现在看起来像这样。
本周总计现在只是[WeekTotal](以前是[SUM(DayTotal)]),平均值的表达式现在是..
=Sum(Fields!WeekTotalAverage.Value) / CountDistinct(Fields!Week.Value)
Run Code Online (Sandbox Code Playgroud)
在矩阵中,有两个行组,第一个按 分组Week,第二个(子组)按 分组Day。列组按 分组Product。
| 归档时间: |
|
| 查看次数: |
3554 次 |
| 最近记录: |