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

Filtraggio in base alle opzioni OFFSET-FETCH nella query Seleziona - Tutorial SQL Server / TSQL Parte 118

Scenario:

Stai lavorando come sviluppatore di SQL Server con il team di sviluppo front-end. Il team front-end deve implementare l'impaginazione. Confusione sull'impaginazione? Nessun problema. Pensa a visualizzare il tuo estratto conto bancario o l'estratto conto della carta di credito. Laddove le applicazioni mostrano solo 10 o 20 record per pagina e devi fare clic su Avanti per vedere i record successivi. Questo si chiama impaginazione. essere utilizzati per restituire i risultati richiesti e dovrebbero essere in grado di passare il numero di pagina per restituire i record.


Soluzione:

Esistono diversi modi per scrivere query di impaginazione, uno di questi è utilizzare la clausola OFFSET FETCH. Devi ordinare i record se vuoi usare OFFSET FETCH.

Creiamo la tabella dbo.TotalSale e inseriamo alcuni record di esempio. Ho inserito solo 11 record.

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) Diciamo che se vogliamo saltare le prime 5 righe e vogliamo mostrare tutte le altre righe che possiamo usare sotto la query.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Come utilizzare la clausola OFFSET FETCH in SQL Server per saltare le prime X righe e mostrarne tutte le altre - Tutorial di SQL Server

2) Ora, se desideriamo mostrare 3 record per pagina, possiamo utilizzare la query di seguito. In questo caso mostreremo la prima pagina

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

Come utilizzare la clausola OFFSET FETCH per restituire i record per pagina in SQL Server - Tutorial di SQL Server

Ho notato che ho OFFSET 0, significa che voglio mostrare la prima pagina e con 3 righe. Se voglio mostrare i record della seconda pagina, imposterò OFFSET 1, la parte SOLO 3 RIGHE successive rimarrà la stessa che desidera mostrare solo 3 righe per pagina.

Possiamo utilizzare variabili, quindi possiamo non è necessario apportare modifiche alla query e modificando il valore delle variabili, possiamo restituire i risultati richiesti. Se lo desideri, puoi creare una stored procedure utilizzando la query seguente.

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;
 
Se dobbiamo fornire Stored Procedure al team Front End, che accetta il numero di pagina e il numero di righe che vorrebbe restituire per ogni pagina, puoi utilizzare di seguito per creare Stored Procedure.

Crea procedura 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

Diciamo che se desideriamo restituire la seconda pagina con 4 record, possiamo utilizzare dbo.sp_GetSaleRecordsPerPage fornendo i valori dei parametri seguenti.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Come eseguire l'impaginazione in SQL Server utilizzando la clausola OFFSET FETCH - Tutorial TSQL