如何在SQL中生成分页的分组数据

时间:2012-12-06 10:27:47

标签: sql pagination

我希望对分组数据进行分页,但我的限制是每页只能显示有限数量的行(不是结果)。

例如,每行20行将显示一组或多组结果。每个小组将包括:

  • 包含组标题的行
  • 组中每个结果的一行

如果组中的结果跨越多个页面,则“组标题”行将在后续页面上重复。

到目前为止,我能够union以这样的方式排序结果和组标题,它们形成了一个我可以轻松分页的行表。

select * from (

    select f.Id, f.Name, p.Id As ProviderId, 2 as RowType,
        'Result' as RowTypeTitle
    from Fund f
    inner join Provider p on f.ProviderId = p.Id

    union

    select distinct f2.ProviderId as Id, p2.Name, f2.ProviderId, 1 as RowType,
        'Group Title' as RowTypeTitle
    from Fund f2
    inner join Provider p2 on f2.ProviderId = p2.Id

) u

order by u.ProviderId, u.RowType asc

我在上面的SQL中缺少的是重复的'组标题'行,例如我需要每页只返回20'行'。我怎样才能重构SQL以合并这些?

1 个答案:

答案 0 :(得分:0)

使用函数ROW_NUMBER,您将能够生成多行。然后你算一算你的位置。

理想情况下,您可以使用“With”子句简化语法。但是这里是您的查询的代码。

例如:

 SELECT * FROM
    (select ROW_NUMBER () over(order by t.ProviderId, t.RowType )/20 AS PageID ,* 
     from (

         select * from (

            select f.Id, f.Name, p.Id As ProviderId, 2 as RowType,
                  'Result' as RowTypeTitle
            from Fund f
            inner join Provider p on f.ProviderId = p.Id

         union

            select distinct f2.ProviderId as Id, p2.Name, f2.ProviderId, 1 as RowType,
                 'Group Title' as RowTypeTitle
           from Fund f2
           inner join Provider p2 on f2.ProviderId = p2.Id )y)  t 
         )u


         order by u.ProviderId, u.RowType asc

然后“PageID”会告诉你每页20个数据。