sql >> Database >  >> RDS >> Sqlserver

Filteren op OFFSET-FETCH-opties in Select-query - SQL Server / TSQL-zelfstudie, deel 118

Scenario:

Je werkt als SQL Server-ontwikkelaar met een front-end ontwikkelteam. Het front-endteam moet paginering implementeren. Verwarring over paginering? Geen probleem. Denk aan het inzien van uw bankafschrift of creditcardafschrift. Waar applicaties slechts 10 of 20 records per pagina tonen en je op volgende moet klikken om de volgende records te zien. Dat wordt paginering genoemd. worden gebruikt om de vereiste resultaten te retourneren en ze moeten het paginanummer kunnen doorgeven om records te retourneren.


Oplossing:

Er zijn meerdere manieren om pagineringsquery's te schrijven. Een daarvan is door de OFFSET FETCH-clausule te gebruiken. U moet de records sorteren als u OFFSET FETCH wilt gebruiken.

Laten we een dbo.TotalSale-tabel maken en enkele voorbeeldrecords invoegen. Ik heb slechts 11 records ingevoegd.

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) Stel dat we de eerste 5 rijen willen overslaan en alle overige rijen willen tonen die we onder de query kunnen gebruiken.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Hoe de OFFSET FETCH-clausule in SQL Server te gebruiken om de eerste X-rijen over te slaan en de rest ervan weer te geven - SQL Server-zelfstudie

2) Als we nu 3 records per pagina willen tonen, kunnen we onderstaande query gebruiken. In dit geval tonen we de eerste pagina

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

Hoe de OFFSET FETCH-clausule te gebruiken om records per pagina in SQL Server te retourneren - SQL Server-zelfstudie

Merk op dat ik OFFSET 0 heb, dat betekent dat ik de eerste pagina wil tonen en met 3 rijen. Als ik records op de tweede pagina wil weergeven, stel ik OFFSET 1 in, het gedeelte ALLEEN Volgende 3 RIJEN blijft hetzelfde en wil slechts 3 rijen per pagina tonen.

We kunnen variabelen gebruiken, zodat we hoeven geen wijzigingen in de query aan te brengen en door de waarde van variabelen te wijzigen, kunnen we onze vereiste resultaten retourneren. U kunt desgewenst een Stored Procedure maken met behulp van onderstaande query.

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;
 
Als we een Stored Procedure moeten leveren aan het Front End-team, dat het paginanummer en het aantal rijen dat ze voor elke pagina willen retourneren accepteert, kunt u hieronder de Stored Procedure gebruiken.

Procedure aanmaken 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

Stel dat als we de tweede pagina met 4 records willen retourneren, we de dbo.sp_GetSaleRecordsPerPage kunnen gebruiken door onderstaande parameterwaarden op te geven.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Paginering in SQL Server uitvoeren met behulp van de OFFSET FETCH-clausule - TSQL-zelfstudie
 




  1. SQL Group BY, Top N Items voor elke groep

  2. mysql:haal het aantal records tussen twee datum-tijd

  3. Overzicht van server-side programmering in PostgreSQL

  4. Aantal(*) versus Aantal(1) - SQL Server