Estrarre un solo record per valore

mercoledì 19 marzo 2008 - 15.59

gigi90 Profilo | Senior Member

Salve a tutti volevo sapere se esisteva una funzione o qualcosa del linguaggio SQL/T-SQL che su una serie su una tabella estrae solo il primo record di un determinato valore in un campo:

Tabella:

Nome | Cognome | Eta
Pippo Rossi 23
Mario Bruno 23
Ciccio Pasticcio 17
Rosa Verde 55
Caio Gracco 55

Mi deve estrarre il primo record per ogni valore di età,quindi il risultato della query dovrebbe essere:

Nome | Cognome | Eta
Pippo Rossi 23
Ciccio Pasticcio 17
Rosa Verde 55

Grazie

alx_81 Profilo | Guru

>Salve a tutti
Ciao!

>volevo sapere se esisteva una funzione o qualcosa
>del linguaggio SQL/T-SQL che su una serie su una tabella estrae
>solo il primo record di un determinato valore in un campo:
>Mi deve estrarre il primo record per ogni valore di età,quindi
>il risultato della query dovrebbe essere:
>
>Nome | Cognome | Eta
>Pippo Rossi 23
>Ciccio Pasticcio 17
>Rosa Verde 55
Basta utilizzare le funzioni di aggregazione e la clausola GROUP BY. Però, in base a cosa scegli il primo fra gli n con la medesima età? Che dbms utilizzi?


>Grazie
di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gigi90 Profilo | Senior Member

Potresti mostrarmi una query di esempio?, cmq utilizzo SQL Server

alx_81 Profilo | Guru

>Potresti mostrarmi una query di esempio?, cmq utilizzo SQL Server
Quale versione?
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gigi90 Profilo | Senior Member

2005, ti premetto che se metto il GROUP BY dice che non si può raggruppare poichè mi da errore sugli altri campi dicendo che non sono inclusi ne in una funione di aggregazione ne nel GROUP BY

alx_81 Profilo | Guru

>2005, ti premetto che se metto il GROUP BY dice che non si può
>raggruppare poichè mi da errore sugli altri campi dicendo che
>non sono inclusi ne in una funione di aggregazione ne nel GROUP BY
Quello è normale. Se raggruppi un campo, gli altri devono essere aggregati altrimenti la query non gira.
Più che altro. Come ti chiedevo prima, qual è il criterio secondo cui scegli un nome piuttosto che l'altro a parità di età?

Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

gigi90 Profilo | Senior Member

In base al primo che estrae la query, cmq per me è irrilevante cioè puo essere estratto anche il secondo o il terzo

alx_81 Profilo | Guru

>In base al primo che estrae la query, cmq per me è irrilevante
>cioè puo essere estratto anche il secondo o il terzo
Ok, prendo la max (quindi il più "avanti" nell'alfabeto ):

Eccoti l'esempio:

USE tempdb; CREATE TABLE dbo.Utenti ( IDUtente int IDENTITY(1,1) PRIMARY KEY CLUSTERED , Nome varchar(30) NOT NULL , Cognome varchar(30) NOT NULL , Eta tinyint NOT NULL ) GO INSERT INTO dbo.Utenti VALUES ('Pippo','Rossi',23) INSERT INTO dbo.Utenti VALUES ('Mario','Bruno',23) INSERT INTO dbo.Utenti VALUES ('Ciccio','Pasticcio',17) INSERT INTO dbo.Utenti VALUES ('Rosa','Verde',55) INSERT INTO dbo.Utenti VALUES ('Caio','Gracco',55) GO SELECT NomeUtente = MAX(Nome + ' ' + Cognome) , Eta FROM dbo.Utenti GROUP BY Eta GO -- pulizia DROP TABLE dbo.Utenti GO
Alx81 =)

http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>In base al primo che estrae la query, cmq per me è irrilevante
>cioè puo essere estratto anche il secondo o il terzo

OK, osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Studenti( StudenteID int NOT NULL IDENTITY PRIMARY KEY, Nome varchar(10) NOT NULL, Cognome varchar(10) NOT NULL, Eta tinyint NOT NULL ); INSERT dbo.Studenti VALUES('Pippo', 'Rossi', 23); INSERT dbo.Studenti VALUES('Mario', 'Bruno', 23); INSERT dbo.Studenti VALUES('Ciccio', 'Pasticcio', 17); INSERT dbo.Studenti VALUES('Rosa', 'Verde', 55); INSERT dbo.Studenti VALUES('Caio', 'Gracco', 55); WITH CTE_GetStudent AS ( SELECT MIN(StudenteID) AS StudenteID FROM dbo.Studenti GROUP BY Eta ) SELECT S.* FROM dbo.Studenti AS S JOIN CTE_GetStudent AS CTE ON S.StudenteID = CTE.StudenteID ORDER BY S.StudenteID; /* Output: StudenteID Nome Cognome Eta ----------- ---------- ---------- ---- 1 Pippo Rossi 23 3 Ciccio Pasticcio 17 4 Rosa Verde 55 (3 row(s) affected) */ DROP TABLE dbo.Studenti;

Se utilizzi una versione di SQL Server antecedente alla 2005, la CTE può essere sostituita da una tabella derivata.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gigi90 Profilo | Senior Member

Per alx_81, avevo pensato anche io di fare cos', solamente che mi servono i vari campi(nome,cognome,ecc) divisi in più colonne, grazie lo stesso, cmq grazie comunque per l'aiuto.

Per lbenaglia, grazie per la soluzione credo che così vada bene, gia che ci siamo, mi spiegi cosa è sta istruzione with cte_..., e se appartiene all'SQL standard oppure solo a SQL Server???

lbenaglia Profilo | Guru

>Per lbenaglia, grazie per la soluzione credo che così vada bene,
>gia che ci siamo, mi spiegi cosa è sta istruzione with cte_...,
>e se appartiene all'SQL standard oppure solo a SQL Server???

Le Common Table Expression aderiscono allo standard ANSI SQL-99.
Sui Books Online troverai tutte le informazioni che cerchi:

"Using Common Table Expressions"
http://msdn2.microsoft.com/en-us/library/ms190766.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

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