sql >> データベース >  >> RDS >> Sqlserver

SelectクエリのOFFSET-FETCHオプションによるフィルタリング-SQLServer/TSQLチュートリアルパート118

    シナリオ:

    あなたはフロントエンド開発チームでSQLServer開発者として働いています。フロントエンドチームはページネーションを実装する必要があります。ページネーションについて混乱しますか?問題ない。銀行の明細書またはクレジットカードの明細書を表示することを検討してください。アプリケーションが1ページあたり10または20レコードしか表示せず、次のレコードを表示するには[次へ]をクリックする必要がある場合。これはページネーションと呼ばれます。

    ページネーションについて理解したので、フロントエンド開発には次のSQLクエリが必要です。必要な結果を返すために使用され、レコードを返すためにページ番号を渡すことができる必要があります。


    解決策:

    ページネーションクエリを作成する方法は複数あります。そのうちの1つは、OFFSETFETCH句を使用する方法です。 OFFSET FETCHを使用する場合は、レコードを並べ替える必要があります。

    dbo.TotalSaleテーブルを作成し、いくつかのサンプルレコードを挿入しましょう。 11個のレコードしか挿入していません。

    CREATE TABLE [dbo].[TotalSale]
        (
          [id] [int] NOT NULL ,
          [SalePersonFName] [varchar](100) NULL ,
          [SalePersonLName] [varchar](100) NULL ,
          [ProductName] [varchar](100) NULL ,
          [ItemsSold] [int] NULL ,
          [SoldPrice] [float] NULL ,
          [SoldDate] [date] NULL ,
          [City] [varchar](100) NULL ,
          [State] [varchar](100) NULL ,
          [Country] [varchar](100) NULL ,
          [Region] [varchar](100) NULL
        )
    
    INSERT  [dbo].[TotalSale]
            ( [id], [SalePersonFName], [SalePersonLName], [ProductName],
              [ItemsSold], [SoldPrice], [SoldDate], [City], [State], [Country],
              [Region] )
    VALUES  ( 1, N'Aamir', N'Shahzad', N'TV', 1, 700, CAST(N'2015-07-15' AS DATE),
              N'Charlotte', N'NC', N'USA', N'North America' )
      ,     ( 2, N'M', N'Raza', N'Cell Phone', 2, 800, CAST(N'2015-07-15' AS DATE),
              N'Charlotte', N'NC', N'USA', N'North America' )
      ,     ( 3, N'Christy', N'Ladson', N'TV', 3, 1600,
              CAST(N'2015-04-02' AS DATE), N'High Point', N'NC', N'USA',
              N'North America' )
      ,     ( 4, N'John', N'Rivers', N'Laptop', 5, 2400,
              CAST(N'2014-03-09' AS DATE), N'Jersey City', N'NJ', N'USA',
              N'North America' )
      ,     ( 5, N'Najaf', N'Ali', N'Computer', 1, 300,
              CAST(N'2015-06-20' AS DATE), N'Karachi', N'Sindh', N'Pakistan',
              N'Asia' )
      ,     ( 6, N'Sukhjeet', N'Singh', N'TV', 2, 900, CAST(N'2015-06-21' AS DATE),
              N'ChandiGar', N'Punjab', N'India', N'Asia' )
      ,     ( 7, N'Chirag', N'Patel', N'Cell Phone', 5, 1500,
              CAST(N'2015-06-23' AS DATE), N'AhmadAbad', N'Gujrat', N'India',
              N'Asia' )
      ,     ( 8, N'Aleena', N'Aman', N'Laptop', 2, 800,
              CAST(N'2015-05-25' AS DATE), N'Lahore', N'Punjab', N'Pakistan',
              N'Asia' )
      ,     ( 9, N'Petra', N'Henry', N'TV', 10, 5000, CAST(N'2015-04-08' AS DATE),
              N'Paris', N'Île-de-France', N'France', N'Europe' )
      ,     ( 10, N'Rita', N'Roger', N'Laptop', 7, 2100,
              CAST(N'2015-04-11' AS DATE), N'Paris', N'Île-de-France', N'France',
              N'Europe' )
      ,     ( 11, N'Tamara', N'Tony', N'Cell Phone', 2, 1200,
              CAST(N'2015-03-03' AS DATE), N'Frankfurt', N'Hesse', N'Germany',
              N'Europe' )
     
    1)最初の5行をスキップして、クエリの下で使用できる残りのすべての行を表示したい場合を考えてみましょう。

    Select 
    [id], [SalePersonFName], [SalePersonLName], [ProductName],
    [ItemsSold], [SoldPrice]
     from dbo.TotalSale 
              order by id
              OFFSET 5 rows
    >
    SQLServerでOFFSETFETCH句を使用して、最初のX行をスキップし、残りのすべての行を表示する方法-SQLServerチュートリアル

    2)1ページに3つのレコードを表示したい場合は、以下のクエリを使用できます。この場合、最初のページを表示します

    Select 
    [id], [SalePersonFName], [SalePersonLName], [ProductName],
    [ItemsSold], [SoldPrice]
     from dbo.TotalSale 
              order by id
             OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

    OFFSETFETCH句を使用してSQLServerのページごとにレコードを返す方法-SQLServerチュートリアル

    OFFSET 0があることに気づきました。つまり、最初のページを3行で表示したいということです。 2ページ目のレコードを表示する場合は、OFFSET 1に設定します。次の3行のみの部分は、ページごとに3行のみを表示する場合と同じままです。

    変数を使用できるため、次のようになります。クエリを変更する必要はなく、変数の値を変更することで、必要な結果を返すことができます。必要に応じて、以下のクエリを使用してストアドプロシージャを作成できます。

    Declare @PageNumber int
    Declare @RowsPerPage int
    set @RowsPerPage=3
    SET @PageNumber=1
    
    Select 
    [id], [SalePersonFName], [SalePersonLName], [ProductName],
    [ItemsSold], [SoldPrice]
     from dbo.TotalSale 
              order by id
             OFFSET (@PageNumber-1)*@RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
     
    フロントエンドチームにストアドプロシージャを提供する必要がある場合は、ページ番号と各ページに返したい行数を受け入れます。以下を使用して、ストアドプロシージャを作成できます。

    プロシージャdbo.sp_GetSaleRecordsPerPageを作成します
     @PageNumber int,
     @RowsPerPage int
    AS 
    BEGIN
    Select 
    [id], [SalePersonFName], [SalePersonLName], [ProductName],
    [ItemsSold], [SoldPrice]
     from dbo.TotalSale 
              order by id
             OFFSET (@PageNumber-1)*@RowsPerPage 
             ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
    END

    4つのレコードを含む2番目のページを返したい場合は、以下のパラメーター値を指定することでdbo.sp_GetSaleRecordsPerPageを使用できます。

    EXEC dbo.sp_GetSaleRecordsPerPage 2,4
    OFFSETFETCH句を使用してSQLServerでページネーションを実行する方法-TSQLチュートリアル
     




    1. PostgreSQLをリモートで管理するためのヒント

    2. SQLServer2005/2008で曜日を取得する

    3. 親と無限の子を返すステートメントを選択します

    4. 手動データベース展開と自動展開のベンチマーク