Home Page Home Page Tips & Tricks Come numerare le righe con SQL Server 2005

Come numerare le righe con SQL Server 2005


In riferimento al Tip di Sandro Bizioli (link a fondo pagina nei Tips collegati) sulla numerazione delle righe con SQL Server 2000, vi illustriamo come è possibile eseguire la stessa operazione in SQL Server 2005 sftuttando la nuova funzione ROW_NUMBER().

La funzione ROW_NUMBER ( ) restituisce il numero sequenziale di una riga in una partizione di un result set, partendo da 1 per la prima riga di ogni partizione.
La clausola OVER(), obbligatoria, determina la partizione e l'ordinamento del rowset prima che la funzione associata venga applicata.

Vediamo un paio di esempi:

Codice .NET n°1
USE tempdb;
GO

/* Definisco la tabella dbo.myTable */
CREATE TABLE dbo.myTable(
Codice varchar(6) NOT NULL,
Descrizione varchar(25) NOT NULL
);
GO

/* La popolo */
SET NOCOUNT ON;
INSERT dbo.myTable VALUES('SQL2K', 'SQL Server 2000');
INSERT dbo.myTable VALUES('SQL2K5', 'SQL Server 2005');
INSERT dbo.myTable VALUES('VB6', 'Visual Basic 6');
INSERT dbo.myTable VALUES('VB2K5', 'Visual Basic 2005');
INSERT dbo.myTable VALUES('VB2K5E', 'Visual Basic 2005 Express');
SET NOCOUNT OFF;
GO

/* Query */
SELECT
Codice
, Descrizione
, ROW_NUMBER() OVER(ORDER BY Codice) AS 'Row Number'
FROM dbo.myTable;
GO

/* Output:

Codice Descrizione Row Number
------ ------------------------- --------------------
SQL2K SQL Server 2000 1
SQL2K5 SQL Server 2005 2
VB2K5 Visual Basic 2005 3
VB2K5E Visual Basic 2005 Express 4
VB6 Visual Basic 6 5

(5 row(s) affected)

*/


/* Pulizia */
DROP TABLE dbo.myTable;


Questa volta definisco una partizione sulla colonna Codice:

Codice .NET n°2
/* Definisco la tabella dbo.myTable */
CREATE TABLE dbo.myTable(
Codice varchar(6) NOT NULL,
Descrizione varchar(25) NOT NULL
);
GO

/* La popolo */
SET NOCOUNT ON;
INSERT dbo.myTable VALUES('SQL', 'SQL Server 2000');
INSERT dbo.myTable VALUES('SQL', 'SQL Server 2005');
INSERT dbo.myTable VALUES('VB', 'Visual Basic 6');
INSERT dbo.myTable VALUES('VB', 'Visual Basic 2005');
INSERT dbo.myTable VALUES('VB', 'Visual Basic 2005 Express');
SET NOCOUNT OFF;
GO

/* Query */
SELECT
Codice
, Descrizione
, ROW_NUMBER() OVER(PARTITION BY Codice ORDER BY Codice) AS 'Row Number'
FROM dbo.myTable;
GO

/* Output:

Codice Descrizione Row Number
------ ------------------------- --------------------
SQL SQL Server 2000 1
SQL SQL Server 2005 2
VB Visual Basic 6 1
VB Visual Basic 2005 2
VB Visual Basic 2005 Express 3

(5 row(s) affected)

*/


/* Pulizia */
DROP TABLE dbo.myTable;

Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5