我正在尝试在SSRS中创建一个报告,其中我有一个矩阵,其中有性别作为列标题,并特别定义了年龄组作为行。报告按日期排序(即,显示的记录按modifedAt值过滤)。我的问题是,我希望显示所有年龄组类别,即使数据集没有返回该行的任何数据。
因此,例如,如果我将日期设置为没有db行的日期,其中有Age5-16个孩子 - 我仍然想要显示类别名称,但只是让单元格与该行相关显示'0'。相反,报告只会丢弃整行,因为显然查询不返回任何数据。
解决方案是否有一个单独的数据集可以带回整个类别列表,然后以某种方式将它们组合在一起?我被困在这里,所以感谢任何帮助!
答案 0 :(得分:3)
我可以想到几种方法:
数据集级别
不是仅返回DataSet中基础数据中的相关数据,而是包括您希望在所有情况下显示的所有类别。
e.g。对于数据库查询,它可能是inner
和left join
之间的差异,即来自以下内容:
select *
from AgeGroup
inner join MyData on ...
为:
select *
from AgeGroup
left join MyData on ...
因此报告始终显示所有年龄组。如果有NULL
个值,则只显示0。
我认为如果您可以控制DataSet,这是最好的选择 - 您根本不必更新报表,幸运的是,实际的DataSet更改应该是最小的,仍然只有一个DataSet调用,而且它是到目前为止最简单的维护。
报告中的硬代码组
在这里,您要为要显示的每个组添加一个表标题行,因此在所有情况下都会显示这些行。
这里有一些条件表达式来显示值,例如:对于每个组行,它将根据该组进行定制:
=Sum(IIf(Fields!AgeGroup.Value = "5-16", Fields!Amount.Value, Nothing)
这不太灵活,在更改组时需要更新,并且没有尽可能多的布局选项。仍然只有一个DataSet调用,所以这是一个加号。
<强>子报表强>
您可以让父DataSet为每个年龄组显示一行,然后在显示该行所需数据的每一行中嵌入一个子报告。
这使您可以灵活地进行布局,但这会增加报表的复杂性,并且意味着您可以通过其他选项进行大量的DataSet调用。
答案 1 :(得分:2)
我知道这已经过时了,但我想在数据集级别使用连接来详细说明Ian的第1部分。 (他的答案对于我正在撰写的报告非常有帮助。)
每个操作:
解决方案是否有一个单独的数据集可以带回整个类别列表,然后以某种方式将它们组合在一起?
这就是我成功处理它的方法,但你可以通过使用公用表表达式(或临时表)来实际创建单独的数据集。
对于这些示例表:
AGE_Table
ID Group Group_Desc Toys
1 A 00-10 Teddy Bear
2 B 11-20 Video Game
3 C 21-30 Sports Car
4 D 31-40 Mansion
5 E 41-50 Jewelry
People_Table (filtered for whatever date)
ID Name Age Gender Age_Group
1 Ariel 07 F A
2 Brandon 23 M C
3 Chelsea 27 F C
4 Derek 06 M A
您希望看到00-10行的2个结果,21-30行的2个结果,然后仍然看到其他年龄组的行,即使没有任何结果。
我们想要创建一个包含所有不同年龄组的数据集,然后加入它。看看使用常用表表达式的解决方案:
with CTE_Age AS
(SELECT Distinct Age_Group from AGE_Table)
SELECT ID, Name, Age, Gender, CTE_Age.Age_Group FROM People_Table
RIGHT JOIN CTE_Age ON
People_Table.Age_Group = CTE_Age.Age_Group
这将返回:
ID Name Age Gender Age_Group
1 Ariel 7 F A
4 Derek 6 M A
NULL NULL NULL NULL B
2 Brandon 23 M C
3 Chelsea 27 F C
NULL NULL NULL NULL D
NULL NULL NULL NULL E
在数据集中有了这个,你可以在报表生成器方面将NULL值更改为0 - 我认为在2008R2中,默认值只是空白。