在三个 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 条记录。它也将在下一页继续。