如何在SSRS报告中使用SUM(聚合函数)和“隐藏重复项”?

时间:2011-06-14 23:55:17

标签: sql-server reporting-services sum reportingservices-2005

我有一个SSRS网格报告,其标题行SUM()选择子行。

在SQL查询中,一个Shift表内连接到许多Parts表,这意味着Shift表上的Hours字段每个部件都是重复的。我在“小时”单元格上使用“隐藏重复”SSRS功能来直观地修复此问题。问题在于,虽然重复项是隐藏的,但SUM()函数(在报表上,而不是查询中)仍然包含它们的小时总和。

所以,我可能有下表和标题。隐藏了小时(和Shift)的重复,但仍然(不合需要地)包含在求和中。

SHIFT   HOURS     PART   ON HAND
=====   =======   ====   =======
        SUM:  8          SUM: 90
=====   =======   ====   =======
1st           3   X12Z        20
                  J23Z        10
2nd           1   Y36P        30
3rd           1   Q90F        30

我正在简化实际报告,因此以不同方式显示数据不是一种选择。此外,这些已经在一个组中,所以我不确定我可以添加另一个组。如何让SUM()函数返回显示的小时数总和?

修改

我已经对自己的问题发表了彻底的答案,但如果有更好的方法可以做到这一点或我的答案可以改进,请随时提出批评。如果仍有答案显着改善我的方法,我会接受它们。

2 个答案:

答案 0 :(得分:1)

使用存储过程。在开始将结果放在临时表#X中时继续。在结果上打开游标并遍历行。每当您更改标识列时,请将小时数设置为null。然后返回结果,报告应该按原样运行。

答案 1 :(得分:1)

鉴于这种格式在报告中可能是多么常见,我希望有更多的答案或者至少有更好的方法来做到这一点。但是,唉,我的方法如下:

不是实现cursor并遍历表,而是在存储过程中对原始结果运行此update。它清除重复字段的值(即shift,hours),其中当前行的部分不是为此Shift返回的第一行的一部分。如果原始查询中有order by,请将其包含在嵌套select中:

update @tempResults
set    shift = null, -- Shift is a duplicated field.
       hours = null, -- Hours is a duplicated field.
where  part <> -- The part number identifies the duplicates.
       (
           select top 1 part
           from  #tempresults t
           where #tempresults.shift = t.shift -- Parts were grouped by shift.
           -- order by    the same fields from the original select statement.
       )

基本上,公式是:

  1. 取消“父”表中的字段(1:m关系中的1)。
  2. 使用“子”表的标识字段设置update的{​​{1}}。
  3. 使用父表的标识字段设置where的{​​{1}}。