Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Filtern nach OFFSET-FETCH-Optionen in Select-Abfrage - SQL Server / TSQL-Tutorial Teil 118

Szenario :

Sie arbeiten als SQL Server-Entwickler mit einem Front-End-Entwicklungsteam. Das Front-End-Team muss die Paginierung implementieren. Verwirrung über Paginierung? Kein Problem. Denken Sie daran, Ihren Kontoauszug oder Ihre Kreditkartenabrechnung einzusehen. Wo Anwendungen nur 10 oder 20 Datensätze pro Seite anzeigen und Sie auf „Weiter“ klicken müssen, um die nächsten Datensätze zu sehen. Das nennt man Paginierung.

Jetzt haben Sie die Paginierung verstanden, die Frontend-Entwicklung benötigt eine SQL-Abfrage von Ihnen, die dies kann verwendet werden, um die erforderlichen Ergebnisse zurückzugeben, und sie sollten in der Lage sein, Seitenzahlen an die Rückgabe von Datensätzen weiterzugeben.


Lösung:

Es gibt mehrere Möglichkeiten, Paginierungsabfragen zu schreiben. Eine davon ist die Verwendung der OFFSET FETCH-Klausel. Sie müssen die Datensätze sortieren, wenn Sie OFFSET FETCH verwenden möchten.

Lassen Sie uns eine dbo.TotalSale-Tabelle erstellen und einige Beispieldatensätze einfügen. Ich habe nur 11 Datensätze eingefügt.

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) Angenommen, wir möchten die ersten 5 Zeilen überspringen und alle restlichen Zeilen anzeigen, die wir unter der Abfrage verwenden können.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Wie man die OFFSET FETCH-Klausel in SQL Server verwendet, um die ersten X Zeilen zu überspringen und alle anderen anzuzeigen - SQL Server Tutorial

2) Wenn wir nun 3 Datensätze pro Seite anzeigen möchten, können wir die folgende Abfrage verwenden. In diesem Fall zeigen wir die erste Seite

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

Verwenden der OFFSET FETCH-Klausel zum Zurückgeben von Datensätzen pro Seite in SQL Server - SQL Server Tutorial

Ich habe bemerkt, dass ich OFFSET 0 habe, das bedeutet, dass ich die erste Seite und mit 3 Zeilen anzeigen möchte. Wenn ich Datensätze der zweiten Seite anzeigen möchte, stelle ich OFFSET 1 ein, der Teil „Nur die nächsten 3 Zeilen“ bleibt gleich, da nur 3 Zeilen pro Seite angezeigt werden sollen.

Wir können Variablen verwenden, damit wir müssen keine Änderungen an der Abfrage vornehmen und durch Ändern des Werts von Variablen können wir unsere erforderlichen Ergebnisse zurückgeben. Sie können eine gespeicherte Prozedur erstellen, wenn Sie möchten, indem Sie die folgende Abfrage verwenden.

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;
 
Wenn wir dem Front-End-Team eine gespeicherte Prozedur bereitstellen müssen, die die Seitennummer und die Anzahl der Zeilen akzeptiert, die sie für jede Seite zurückgeben möchten, können Sie unten verwenden, um eine gespeicherte Prozedur zu erstellen.

Erstellen Sie die Prozedur 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

Nehmen wir an, wenn wir die zweite Seite mit 4 Datensätzen zurückgeben möchten, können wir dbo.sp_GetSaleRecordsPerPage verwenden, indem wir die folgenden Parameterwerte angeben.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Wie man eine Paginierung in SQL Server mit der OFFSET FETCH-Klausel durchführt – TSQL-Tutorial