sql >> Database teknologi >  >> RDS >> Sqlserver

Filtrering efter OFFSET-FETCH-indstillinger i Vælg forespørgsel - SQL Server / TSQL vejledning del 118

Scenarie :

Du arbejder som SQL Server-udvikler med frontend-udviklingsteam. Frontend-teamet skal implementere paginering. Forvirret omkring sideinddeling? Intet problem. Tænk på at se dit kontoudtog eller kreditkortudtog. Hvor applikationer kun viser 10 eller 20 poster pr. side, og du skal klikke på næste for at se næste poster. Det kaldes paginering.

Nu forstår du paginering, frontend-udviklingen har brug for SQL-forespørgsler fra dig, der kan bruges til returnerede påkrævede resultater, og de bør kunne sende sidenummer for at returnere poster.


Løsning:

Der er flere måder at skrive sideinddelingsforespørgsler på. En af dem er ved at bruge OFFSET FETCH-klausulen. Du skal sortere posterne, hvis du vil bruge OFFSET FETCH.

Lad os oprette en dbo.TotalSale-tabel og indsætte nogle eksempelposter. Jeg har kun indsat 11 poster.

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) Lad os sige, hvis vi gerne vil springe de første 5 rækker over og ønsker at vise alle resten af ​​rækkerne, vi kan bruge nedenfor forespørgslen.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Sådan bruger du OFFSET FETCH-klausul i SQL Server til at springe de første X rækker over og vise alle resten af ​​dem - SQL Server Tutorial

2) Hvis vi nu gerne vil vise 3 poster pr. side, kan vi bruge nedenstående forespørgsel. I dette tilfælde skal vi vise første side

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

Sådan bruges OFFSET FETCH-klausulen til at returnere poster pr. side i SQL Server - SQL Server-vejledning

Bemærket at jeg har OFFSET 0, det betyder at jeg vil vise første side og med 3 rækker. Hvis jeg ønsker at vise anden side-poster, vil jeg indstille til OFFSET 1, ONLY Next 3 ROWS-delen vil forblive den samme som kun ønsker at vise 3 rækker pr. side.

Vi kan bruge variabler, så vi behøver ikke at foretage ændringer i forespørgslen, og ved at ændre værdien af ​​variabler kan vi returnere vores ønskede resultater. Du kan oprette Stored Procedure, hvis du vil ved at bruge nedenstående forespørgsel.

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;
 
Hvis vi skal levere Stored Procedure til Front End-teamet, som accepterer sidetal og antal rækker, de gerne vil returnere for hver side, kan du bruge nedenfor til at oprette Stored Procedure.

Opret procedure 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

Lad os sige, at hvis vi gerne vil returnere anden side med 4 poster, kan vi bruge dbo.sp_GetSaleRecordsPerPage ved at angive nedenstående parameterværdier.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Sådan udføres sideinddeling i SQL Server ved hjælp af OFFSET FETCH-klausul - TSQL-vejledning
 




  1. Få topresultater for hver gruppe (i Oracle)

  2. Skal erklære den skalære variabel

  3. SQL - trækker en udtømningsværdi fra rækker

  4. Oracle Database Test Challenge - Sammenlign Skema Data