在三个 table 中显示记录,在 SSRS 报告中每个 table 中的行数不一致
Show records in three tables with defiate number of rows in each table in SSRS report
我在报告中有一个 table
我想在每页显示三个table秒的记录,每个table只包含20条记录。
第 1 页:
第 2 页:
如何实现这种模式?
我可以想到 2 种方法来做到这一点,作为一个 MATRIX 样式的报告,其中列组是您的列,以及作为一个普通的 table,您在其中连接数据以生成名称、ID 的 3 个副本,以及您想要的任何其他字段。 MATRIX 样式绝对更优雅和灵活,但如果您将报告交给高级用户,则普通 table 可能更容易让客户修改。
这两种解决方案都是从使用 PAGE、ROW 和 COLUMN 信息标记数据开始的。请注意,我在 NAME 上排序,但您可以在任何字段上排序。另请注意,此解决方案不依赖于您的 ID 是连续的,并且按照您想要的顺序,它会根据 NAME 或您选择的任何其他内容生成自己的序列号。
在此演示中,我将 RowsPerPage 和 NumberofColumns 设置为硬编码常量,但如果您使用 MATRIX 格式,它们很容易成为用户选择的参数。
DECLARE @RowsPerPage INT = 20
DECLARE @Cols INT = 3
;with
--Fake data generation BEGIN
cteSampleSize as (SELECT TOP 70 ROW_NUMBER () OVER (ORDER BY O.name) as ID
FROM sys.objects as O
), cteFakeData as (
SELECT N.ID, CONCAT(CHAR(65 + N.ID / 26), CHAR(65 + ((N.ID -1) % 26))
--, CHAR(65 + ((N.ID ) % 26))
) as Name
FROM cteSampleSize as N
),
--Fake data generation END, real processing begins below
cteNumbered as ( -- We can't count on ID being sequential and in the order we want!
SELECT D.*, ROW_NUMBER () OVER (ORDER BY D.Name) as SeqNum
--Replace ORDER BY D.Name with ORDER BY D.{Whatever field}
FROM cteFakeData as D --Replace cteFakeData with your real data source
), ctePaged as (
SELECT D.*
, 1+ FLOOR((D.SeqNum -1) / (@RowsPerPage*@Cols)) as PageNum
, 1+ ((D.SeqNum -1) % @RowsPerPage) as RowNum
, 1+ FLOOR(((D.SeqNum-1) % (@RowsPerPage*@Cols) ) / @RowsPerPage) as ColNum
FROM cteNumbered as D
)
--FINAL - use this for MATRIX reports (best)
SELECT * FROM ctePaged ORDER BY SeqNum
如果您想使用 JOIN 方法在正常情况下允许这样做 table,请将上面的 --FINAL 查询替换为这个查询。请注意,它非常挑剔,因此请在最终报告中以不同程度的丰满度对其进行测试。我测试了 70 行和 90 行样本数据,所以我有部分第一列和完整的第一列和部分第二列。
--FINAL - use this for TABLE reports (simpler)
SELECT C1.PageNum , C1.RowNum , C1.ID as C1_ID, C1.Name as C1_Name
, C2.ID as C2_ID, C2.Name as C2_Name
, C3.ID as C3_ID, C3.Name as C3_Name
FROM ctePaged as C1 LEFT OUTER JOIN ctePaged as C2
ON C1.PageNum = C2.PageNum AND C1.RowNum = C2.RowNum
AND C1.ColNum = 1 AND (C2.ColNum = 2 OR C2.ColNum IS NULL)
LEFT OUTER JOIN ctePaged as C3 ON C1.PageNum = C3.PageNum
AND C1.RowNum = C3.RowNum AND (C3.ColNum = 3 OR C3.ColNum IS NULL)
WHERE C1.ColNum = 1
1) 使用以下查询添加数据集以获取页码和 Table 编号。您可以根据需要更改数字 20 和 60。在我的例子中,每个部分需要 20 条记录并且有 3 个部分,因此每页的总记录数为 60。
Select *,(ROW_NUMBER ( ) OVER ( partition by PageNumber order by Id )-1)/20 AS TableNumber from (
Select (ROW_NUMBER ( ) OVER ( order by Id )-1)/60 AS PageNumber
,* from Numbers
)Src
2)添加一列的table和select准备好的数据集
3)在Details组的组表达式中添加PageNumber
。
4) 通过右键单击详细信息行添加列父组。 Select 按 TableNumber
.
分组
5) 删除前两行。 Select 仅删除行。
6) 再添加一个 table 和 select ID 和 Name。
7) 将这个新创建的 table 拖到之前创建的 table 的单元格中。并增加 table.
的大小
结果:
每个 table 部分包含 20 条记录。它也将在下一页继续。
我在报告中有一个 table
我想在每页显示三个table秒的记录,每个table只包含20条记录。
第 1 页:
第 2 页:
如何实现这种模式?
我可以想到 2 种方法来做到这一点,作为一个 MATRIX 样式的报告,其中列组是您的列,以及作为一个普通的 table,您在其中连接数据以生成名称、ID 的 3 个副本,以及您想要的任何其他字段。 MATRIX 样式绝对更优雅和灵活,但如果您将报告交给高级用户,则普通 table 可能更容易让客户修改。
这两种解决方案都是从使用 PAGE、ROW 和 COLUMN 信息标记数据开始的。请注意,我在 NAME 上排序,但您可以在任何字段上排序。另请注意,此解决方案不依赖于您的 ID 是连续的,并且按照您想要的顺序,它会根据 NAME 或您选择的任何其他内容生成自己的序列号。
在此演示中,我将 RowsPerPage 和 NumberofColumns 设置为硬编码常量,但如果您使用 MATRIX 格式,它们很容易成为用户选择的参数。
DECLARE @RowsPerPage INT = 20
DECLARE @Cols INT = 3
;with
--Fake data generation BEGIN
cteSampleSize as (SELECT TOP 70 ROW_NUMBER () OVER (ORDER BY O.name) as ID
FROM sys.objects as O
), cteFakeData as (
SELECT N.ID, CONCAT(CHAR(65 + N.ID / 26), CHAR(65 + ((N.ID -1) % 26))
--, CHAR(65 + ((N.ID ) % 26))
) as Name
FROM cteSampleSize as N
),
--Fake data generation END, real processing begins below
cteNumbered as ( -- We can't count on ID being sequential and in the order we want!
SELECT D.*, ROW_NUMBER () OVER (ORDER BY D.Name) as SeqNum
--Replace ORDER BY D.Name with ORDER BY D.{Whatever field}
FROM cteFakeData as D --Replace cteFakeData with your real data source
), ctePaged as (
SELECT D.*
, 1+ FLOOR((D.SeqNum -1) / (@RowsPerPage*@Cols)) as PageNum
, 1+ ((D.SeqNum -1) % @RowsPerPage) as RowNum
, 1+ FLOOR(((D.SeqNum-1) % (@RowsPerPage*@Cols) ) / @RowsPerPage) as ColNum
FROM cteNumbered as D
)
--FINAL - use this for MATRIX reports (best)
SELECT * FROM ctePaged ORDER BY SeqNum
如果您想使用 JOIN 方法在正常情况下允许这样做 table,请将上面的 --FINAL 查询替换为这个查询。请注意,它非常挑剔,因此请在最终报告中以不同程度的丰满度对其进行测试。我测试了 70 行和 90 行样本数据,所以我有部分第一列和完整的第一列和部分第二列。
--FINAL - use this for TABLE reports (simpler)
SELECT C1.PageNum , C1.RowNum , C1.ID as C1_ID, C1.Name as C1_Name
, C2.ID as C2_ID, C2.Name as C2_Name
, C3.ID as C3_ID, C3.Name as C3_Name
FROM ctePaged as C1 LEFT OUTER JOIN ctePaged as C2
ON C1.PageNum = C2.PageNum AND C1.RowNum = C2.RowNum
AND C1.ColNum = 1 AND (C2.ColNum = 2 OR C2.ColNum IS NULL)
LEFT OUTER JOIN ctePaged as C3 ON C1.PageNum = C3.PageNum
AND C1.RowNum = C3.RowNum AND (C3.ColNum = 3 OR C3.ColNum IS NULL)
WHERE C1.ColNum = 1
1) 使用以下查询添加数据集以获取页码和 Table 编号。您可以根据需要更改数字 20 和 60。在我的例子中,每个部分需要 20 条记录并且有 3 个部分,因此每页的总记录数为 60。
Select *,(ROW_NUMBER ( ) OVER ( partition by PageNumber order by Id )-1)/20 AS TableNumber from (
Select (ROW_NUMBER ( ) OVER ( order by Id )-1)/60 AS PageNumber
,* from Numbers
)Src
2)添加一列的table和select准备好的数据集
3)在Details组的组表达式中添加PageNumber
。
4) 通过右键单击详细信息行添加列父组。 Select 按 TableNumber
.
5) 删除前两行。 Select 仅删除行。
6) 再添加一个 table 和 select ID 和 Name。
7) 将这个新创建的 table 拖到之前创建的 table 的单元格中。并增加 table.
的大小结果:
每个 table 部分包含 20 条记录。它也将在下一页继续。