我有一个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()
函数返回显示的小时数总和?
修改
我已经对自己的问题发表了彻底的答案,但如果有更好的方法可以做到这一点或我的答案可以改进,请随时提出批评。如果仍有答案显着改善我的方法,我会接受它们。
答案 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.
)
基本上,公式是:
update
的{{1}}。where
的{{1}}。