0

グループ化されたデータをページ分割したいのですが、ページごとに限られた数の行(結果ではない)しか表示できないという制限があります。

たとえば、20行の各ページには、1つ以上の結果グループが表示されます。各グループは以下で構成されます。

  • グループタイトルを含む行
  • グループ内の各結果の行

結果が複数のページにまたがるグループになる場合、「グループタイトル」の行は後続のページで繰り返されます。

これまでのところ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に欠けているのは、重複する「グループタイトル」行です。たとえば、1ページあたり20行のみを返す必要があります。これらを組み込むためにSQLをリファクタリングするにはどうすればよいですか?

4

1 に答える 1

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個ずつデータを配置するページを示します。

于 2012-12-06T14:33:50.293 に答える