sql >> Database >  >> RDS >> Sqlserver

Krijg het totale aantal rijen tijdens het oproepen

U hoeft de query niet twee keer uit te voeren.

SELECT ..., total_count = COUNT(*) OVER()
FROM ...
ORDER BY ...
OFFSET 120 ROWS
FETCH NEXT 10 ROWS ONLY;

Gebaseerd op de chat , het lijkt erop dat uw probleem iets complexer is - u past DISTINCT . toe naar het resultaat naast paging. Dit kan het ingewikkeld maken om precies te bepalen wat de COUNT() eruit moet zien en waar het heen moet. Hier is een manier (ik wil dit alleen demonstreren in plaats van te proberen de techniek op te nemen in uw veel complexere vraag vanuit de chat):

USE tempdb;
GO
CREATE TABLE dbo.PagingSample(id INT,name SYSNAME);

-- insert 20 rows, 10 x 2 duplicates
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;

SELECT COUNT(*) FROM dbo.PagingSample; -- 20

SELECT COUNT(*) FROM (SELECT DISTINCT id, name FROM dbo.PagingSample) AS x; -- 10

SELECT DISTINCT id, name FROM dbo.PagingSample; -- 10 rows

SELECT DISTINCT id, name, COUNT(*) OVER() -- 20 (DISTINCT is not computed yet)
 FROM dbo.PagingSample
 ORDER BY id, name
 OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY; -- 5 rows

-- this returns 5 rows but shows the pre- and post-distinct counts:
SELECT PostDistinctCount = COUNT(*) OVER() -- 10, 
  PreDistinctCount -- 20, 
  id, name 
FROM 
(
  SELECT DISTINCT id, name, PreDistinctCount = COUNT(*) OVER() 
    FROM dbo.PagingSample
    -- INNER JOIN ...
) AS x
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY;

Opruimen:

DROP TABLE dbo.PagingSample;
GO


  1. Query om alle records te krijgen totdat de som van de kolom kleiner is dan of gelijk is aan een waarde

  2. Wikipedia-dump importeren naar SQL-base

  3. Voeg u:mm pm/am-tijdformaat in de database in met behulp van MYSQL

  4. Hoe PHP-testserver instellen in Dreamweaver?