我的 SSRS 报告:最初需要隐藏与 ID 关联的其他行,但在 ID-Specific 扩展报告时可见
My SSRS Report: Additional Rows Associated with ID Need to be Initially Hidden, Yet Visible Upon ID-Specific Expansion of Report
我的问题
我试图让一些数据在 SSRS 中以某种方式显示,但我似乎无法让它准确显示我想要的方式,尽管我花了很多时间寻找解决方案。
我的数据
我拥有的数据存储在数据库 table 中,包括学生与导师的约会。每个约会都有一个对该约会唯一的 Appointment_ID,但 Appointment_ID 不是 table 中的唯一值。也就是说,每当对特定约会进行更改时,例如该约会的位置或时间更改,都会在 table 中创建与该 Appointment_ID 关联的附加行,因此可以与同一 Appointment_ID 关联的多行,根据更改内容包含略有不同的值。
我的报告
我正在使用 SQL 将数据从 table 提取到 SSRS,并且在我的查询中我使用 table 的行日期创建字段来计算新字段用于标识为 Appointment_ID 创建的第一行,以及一个由整数序列组成的字段,用于标识该约会的最早到最新条目。
我想在 SSRS 中显示数据,就像我在下面“示例 1”中显示的那样,第一行是列 headers,随后的每一行都是列值,但需要注意的是喜欢在其关联的 Appointment_ID 下嵌套值为“CHANGE”的行,这样它们最初是隐藏的,只有在用户选择通过单击 Appointment_ID(或旁边的 + 符号)来展开报告时才可见ID),以便显示与该 Appointment_ID 关联的所有行。请参阅下面的“示例 2”,以直观地表示当用户单击 Appointment_ID.
时我希望如何显示数据
示例 1:报表加载时数据的初始显示
Appointment_ID
Student
App_location
Creation_Date
App_Change_Indicator
App_Change_Seq
d9fs73l41
Bob M.
COJ_123
7/7/2020
INITIAL
0
d0s83jfos
Jul S.
ZOOM
8/3/2020
INITIAL
0
dofs09sje
Ted B.
TELEPHONE
6/4/2020
INITIAL
0
...等等
示例 2:示例 1 中的第一个 Appointment_ID 扩展为显示标记为“CHANGE”的其他条目
Appointment_ID
Student
App_Location
Creation_Date
App_Change_Indicator
App_Change_Seq
d9fs73l41
Bob M.
COJ_123
7/7/2020
INITIAL
0
d9fs73l41
Bob M.
ZOOM
7/8/2020
CHANGE
1
d9fs73l41
Bob M.
TELEPHONE
7/9/2020
CHANGE
2
d0s83jfos
Jul S.
ZOOM
8/3/2020
INITIAL
0
dofs09sje
Ted B.
TELEPHONE
6/4/2020
INITIAL
0
...等等
如果我很贪心,我不介意在扩展 Appointment_ID 时对那些 CHANGE 值行应用一些缩进。
我的失败
我的第一印象是通过更改查询中的 where 子句将数据拆分为两个数据集,以创建一个仅由值为“INITIAL”的行组成的数据集和另一个由具有值的行组成的数据集“更改”并将数据集拆分为两个 .rdl 文件,以便我可以通过创建链接 Appointment_ID 的参数来利用 SSRS 的子报告功能,但是当我引入更改数据集时,报告根本不会加载作为子报表。显然,子报表真的很慢,我现在拥有的数据包含大约 100,00 行,并且每天都会添加新行。我想要显示的列也比我在上面的示例中包含的要多得多。我现在使用的 SQL 查询正在使用 CTE,可能我可以通过使用 #temp tables 来稍微优化查询,但我不确定这是否可行,我宁愿无论如何不要走子报告路线,因为包含 CHANGE 约会行的子报告只会在这个报告中使用,而不是在证明子报告方法合理的几个报告中使用。
我的感悟
我觉得必须有一种更简单的方法来实现我想要的效果,它不会像子报表那样影响性能,但是 none 我的搜索和阅读教程为我提供了解决方案。
我的问题
如何在我的报表中显示数据,以便在展开 Appointment_ID 之前隐藏值为 CHANGE 的行?
这并不完美,但已经很接近了。
我做的第一件事是扩展数据集查询中的数据,因此我们有单独的 header 和详细信息列。它只是一个数据集,只是更多的列。
这是我用来重新创建您的示例数据并从数据集查询中 return 它的查询。
DECLARE @t TABLE (Appointment_ID varchar(20), Student varchar(20), App_Location varchar(20), Creation_Date date, App_Change_Indicator varchar(20), App_Change_Seq int)
INSERT INTO @t VALUES
('d9fs73l41', 'Bob M.', 'COJ_123', '2020/7/7', 'INITIAL', 0),
('d9fs73l41', 'Bob M.', 'ZOOM', '2020/8/7', 'CHANGE', 1),
('d9fs73l41', 'Bob M.', 'TELEPHONE', '2020/9/7', 'CHANGE', 2),
('d0s83jfos', 'Jul S.', 'ZOOM', '2020/3/8', 'INITIAL', 0),
('dofs09sje', 'Ted B.', 'TELEPHONE', '2020/4/6', 'INITIAL', 0)
SELECT
hdr.Appointment_ID as hdr_Appointment_ID
, hdr.Student as hdr_Student
, hdr.App_Location as hdr_App_Location
, hdr.Creation_Date as hdr_Creation_Date
, hdr.App_Change_Indicator as hdr_App_Change_Indicator
, hdr.App_Change_Seq as hdr_App_Change_Seq
, det.*
FROM (SELECT * FROM @t WHERE App_Change_Seq = 0) hdr
LEFT JOIN (SELECT * FROM @t WHERE App_Change_Seq != 0) det
ON hdr.Appointment_ID = det.Appointment_ID
我在报告中添加了一个简单的 table 以显示来自数据集查询的原始数据以供参考。
然后我向报告中添加了一个新的 table 并按顺序将所有列 除了 Appointment_ID
拖到其中。
接下来,在主设计器下的行组面板中,我 right-clicked “详细信息”组并执行“添加组 -- Parent 组” 选择 hdr_AppointmentID
作为字段分组依据并选择了添加组的选项 header
接下来,我将每个 hdr_*
个字段副本选择到新创建的行的每一列中。
最后,我右击 header 行作为详细信息行,选择“行可见性”
然后我将行设置为最初隐藏,并将切换项设置为包含 hdr_appointment_ID
字段的文本框的名称。
最终输出最初看起来像这样
如果我展开第三行,它会显示...
不幸的是,如果您展开没有详细信息的行,它仍会展开,但会显示一个空白行。可能有解决此问题的方法,但它是 10:30 pom 这里所以我不是最好的! :)
对于缩进,现在详细信息位于不同的行,您可以按照自己的喜好设置格式。
我的问题
我试图让一些数据在 SSRS 中以某种方式显示,但我似乎无法让它准确显示我想要的方式,尽管我花了很多时间寻找解决方案。
我的数据
我拥有的数据存储在数据库 table 中,包括学生与导师的约会。每个约会都有一个对该约会唯一的 Appointment_ID,但 Appointment_ID 不是 table 中的唯一值。也就是说,每当对特定约会进行更改时,例如该约会的位置或时间更改,都会在 table 中创建与该 Appointment_ID 关联的附加行,因此可以与同一 Appointment_ID 关联的多行,根据更改内容包含略有不同的值。
我的报告
我正在使用 SQL 将数据从 table 提取到 SSRS,并且在我的查询中我使用 table 的行日期创建字段来计算新字段用于标识为 Appointment_ID 创建的第一行,以及一个由整数序列组成的字段,用于标识该约会的最早到最新条目。
我想在 SSRS 中显示数据,就像我在下面“示例 1”中显示的那样,第一行是列 headers,随后的每一行都是列值,但需要注意的是喜欢在其关联的 Appointment_ID 下嵌套值为“CHANGE”的行,这样它们最初是隐藏的,只有在用户选择通过单击 Appointment_ID(或旁边的 + 符号)来展开报告时才可见ID),以便显示与该 Appointment_ID 关联的所有行。请参阅下面的“示例 2”,以直观地表示当用户单击 Appointment_ID.
时我希望如何显示数据示例 1:报表加载时数据的初始显示
Appointment_ID | Student | App_location | Creation_Date | App_Change_Indicator | App_Change_Seq |
---|---|---|---|---|---|
d9fs73l41 | Bob M. | COJ_123 | 7/7/2020 | INITIAL | 0 |
d0s83jfos | Jul S. | ZOOM | 8/3/2020 | INITIAL | 0 |
dofs09sje | Ted B. | TELEPHONE | 6/4/2020 | INITIAL | 0 |
...等等
示例 2:示例 1 中的第一个 Appointment_ID 扩展为显示标记为“CHANGE”的其他条目
Appointment_ID | Student | App_Location | Creation_Date | App_Change_Indicator | App_Change_Seq |
---|---|---|---|---|---|
d9fs73l41 | Bob M. | COJ_123 | 7/7/2020 | INITIAL | 0 |
d9fs73l41 | Bob M. | ZOOM | 7/8/2020 | CHANGE | 1 |
d9fs73l41 | Bob M. | TELEPHONE | 7/9/2020 | CHANGE | 2 |
d0s83jfos | Jul S. | ZOOM | 8/3/2020 | INITIAL | 0 |
dofs09sje | Ted B. | TELEPHONE | 6/4/2020 | INITIAL | 0 |
...等等
如果我很贪心,我不介意在扩展 Appointment_ID 时对那些 CHANGE 值行应用一些缩进。
我的失败
我的第一印象是通过更改查询中的 where 子句将数据拆分为两个数据集,以创建一个仅由值为“INITIAL”的行组成的数据集和另一个由具有值的行组成的数据集“更改”并将数据集拆分为两个 .rdl 文件,以便我可以通过创建链接 Appointment_ID 的参数来利用 SSRS 的子报告功能,但是当我引入更改数据集时,报告根本不会加载作为子报表。显然,子报表真的很慢,我现在拥有的数据包含大约 100,00 行,并且每天都会添加新行。我想要显示的列也比我在上面的示例中包含的要多得多。我现在使用的 SQL 查询正在使用 CTE,可能我可以通过使用 #temp tables 来稍微优化查询,但我不确定这是否可行,我宁愿无论如何不要走子报告路线,因为包含 CHANGE 约会行的子报告只会在这个报告中使用,而不是在证明子报告方法合理的几个报告中使用。
我的感悟
我觉得必须有一种更简单的方法来实现我想要的效果,它不会像子报表那样影响性能,但是 none 我的搜索和阅读教程为我提供了解决方案。
我的问题
如何在我的报表中显示数据,以便在展开 Appointment_ID 之前隐藏值为 CHANGE 的行?
这并不完美,但已经很接近了。
我做的第一件事是扩展数据集查询中的数据,因此我们有单独的 header 和详细信息列。它只是一个数据集,只是更多的列。
这是我用来重新创建您的示例数据并从数据集查询中 return 它的查询。
DECLARE @t TABLE (Appointment_ID varchar(20), Student varchar(20), App_Location varchar(20), Creation_Date date, App_Change_Indicator varchar(20), App_Change_Seq int)
INSERT INTO @t VALUES
('d9fs73l41', 'Bob M.', 'COJ_123', '2020/7/7', 'INITIAL', 0),
('d9fs73l41', 'Bob M.', 'ZOOM', '2020/8/7', 'CHANGE', 1),
('d9fs73l41', 'Bob M.', 'TELEPHONE', '2020/9/7', 'CHANGE', 2),
('d0s83jfos', 'Jul S.', 'ZOOM', '2020/3/8', 'INITIAL', 0),
('dofs09sje', 'Ted B.', 'TELEPHONE', '2020/4/6', 'INITIAL', 0)
SELECT
hdr.Appointment_ID as hdr_Appointment_ID
, hdr.Student as hdr_Student
, hdr.App_Location as hdr_App_Location
, hdr.Creation_Date as hdr_Creation_Date
, hdr.App_Change_Indicator as hdr_App_Change_Indicator
, hdr.App_Change_Seq as hdr_App_Change_Seq
, det.*
FROM (SELECT * FROM @t WHERE App_Change_Seq = 0) hdr
LEFT JOIN (SELECT * FROM @t WHERE App_Change_Seq != 0) det
ON hdr.Appointment_ID = det.Appointment_ID
我在报告中添加了一个简单的 table 以显示来自数据集查询的原始数据以供参考。
然后我向报告中添加了一个新的 table 并按顺序将所有列 除了 Appointment_ID
拖到其中。
接下来,在主设计器下的行组面板中,我 right-clicked “详细信息”组并执行“添加组 -- Parent 组” 选择 hdr_AppointmentID
作为字段分组依据并选择了添加组的选项 header
接下来,我将每个 hdr_*
个字段副本选择到新创建的行的每一列中。
最后,我右击 header 行作为详细信息行,选择“行可见性”
然后我将行设置为最初隐藏,并将切换项设置为包含 hdr_appointment_ID
字段的文本框的名称。
最终输出最初看起来像这样
如果我展开第三行,它会显示...
不幸的是,如果您展开没有详细信息的行,它仍会展开,但会显示一个空白行。可能有解决此问题的方法,但它是 10:30 pom 这里所以我不是最好的! :)
对于缩进,现在详细信息位于不同的行,您可以按照自己的喜好设置格式。