首页 > 解决方案 > 除非SSRS中每组有2行,否则如何隐藏行?

问题描述

我创建了一个视图,显示有孩子的家庭参加了我们机构的多个项目。我们只需要看看两个孩子在两个不同的节目但同一个家庭的情况。将此视图引入 Reporting Services 时,如何仅在每个组有两行时显示并隐藏其余行?例如,如果史密斯一家有两个孩子——一个在启蒙教育中,另一个在早期启蒙教育中——我如何显示这些行但隐藏每个家庭只列出一个孩子的其他行?

目前,我在 SQL 代码中有两个 CASE 语句。一个人创建一列,每次出现的启蒙计划术语都显示 1,否则显示 0。另一个做同样的事情,但每次出现 Early Head Start 计划术语。

我尝试了一条不同的路线,并将这两个 CASE 语句压缩为一列,按家族名称对它们进行分组,并计算每个家族的 1 个。但是,这并没有为我们提供所需的详细数据;我们需要显示每个孩子的姓名和项目术语。

我一直在试验 SSRS 的“行可见性”部分中的 CountRows 表达式和报告 tablix 中的 IIF 语句,但我都无法工作。

SQL 代码:

SELECT CP_Data.dbo.Family.FamilyName,
       CP_Data.dbo.vParticipant.PersonName,
       CP_Data.dbo.vParticipant.ChildPlusID,
       CP_Data.dbo.vParticipant.EnrlStatus,
       CP_Data.dbo.vParticipant.ProgramTermAbbreviation,
       CASE WHEN ProgramTermAbbreviation = 'HS20' THEN 1 ELSE 0 END AS HSIdentifier,
       CASE WHEN ProgramTermAbbreviation = 'EH20' THEN 1 ELSE 0 END AS EHSIdentifier,
       CP_Data.dbo.vParticipant.EnrollmentDate
FROM CP_Data.dbo.vParticipant
     LEFT OUTER JOIN CP_Data.dbo.FamilyMembership ON CP_Data.dbo.vParticipant.ParticipantPersonID = CP_Data.dbo.FamilyMembership.PersonID
     RIGHT OUTER JOIN CP_Data.dbo.Family ON CP_Data.dbo.FamilyMembership.FamilyID = CP_Data.dbo.Family.FamilyID
WHERE (CP_Data.dbo.vParticipant.ProgramTermAbbreviation = 'HS20'
    OR CP_Data.dbo.vParticipant.ProgramTermAbbreviation = 'EH20')
  AND (CP_Data.dbo.vParticipant.EnrlStatus = 'Enrolled'
    OR CP_Data.dbo.vParticipant.EnrlStatus LIKE 'Drop%');

最后,我希望报告只列出在这两个项目中都有孩子的家庭,并隐藏其余的家庭。我应该重新执行 CASE 语句还是在 SSRS 的行可见性设置中实现一行代码?目前,我不确定如何做到这一点。

标签: sql-serverreporting-servicesvisual-studio-2017

解决方案


就个人而言,我会使用RowVisibility来隐藏不符合您条件的行。首先,我建议可能使用该OVER子句来获取一个字段,该字段将标识FamilyName在每个程序中具有一个(或多个)孩子的那些组。

SELECT...
SUM(CASE WHEN ProgramTermAbbreviation = 'HS20' OR ProgramTermAbbreviation = 'EH20' THEN 1 ELSE 0 END) 
    OVER(PARTITION BY FamilyName) AS HSIdentifier

从那里,您可以RowVisibility在值为 1 或更少时将其设置为隐藏。在我看来,最简单的方法是使用如下表达式:

=IIF(Fields!HSIdentifier.Value > 1, false, true)

如果我了解您的数据的工作方式,这应该会为您提供您希望的确切结果,但如果我误解了某些内容,请告诉我。


推荐阅读