Problema 1 Query per 2 select sulla stessa tabella

lunedì 14 settembre 2009 - 14.13

bebeto Profilo | Newbie

Ciao, ho un poblema che mi assilla ormai da due settimane e non ne esco...
Ho una tabella di questo tipo
IDmex IDdis campo1 campo2 campo3 campo4
1 2 x x x x
2 2 x x x x
3 3 x x x x
4 4 x x x x
5 4 x x x x

mi servirebbe una query che mi restituisse tutti i tipi di IDdis una sola volta, e per ogni IDdis selezionati il record con tutti i campi aventi IDmex piu' alto, cioe' nell'esempio:

IDmex IDdis campo1 campo2 campo3 campo4
2 2 x x x x
3 3 x x x x
5 4 x x x x
e' possibile farlo con una sola query? Io ho provato con DISTINCT, GROUP BY ecc... ma non ci riesco.
Vi ringrazio se sapermi dare una risposta anche se negativa.
Bebeto.

dinoxet Profilo | Senior Member

FAI UN GROUP BY PER DDLS ED UN MAX PER L'ALTRO

DOVREBBE BASTARE


DINOXET
__________________________________________
impossible is only a word

bebeto Profilo | Newbie

ho fatto cosi':
select IDdis, max(IDmex) from messaggi
group by IDdis, max(IDmex)

ma mi da' il seguente errore:
Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.

come averte capito sono abbastanza alle prime armi...

dinoxet Profilo | Senior Member

Scrivi così :

select IDdis, max(IDmex) as massimo from messaggi
group by IDdis



DINOXET
__________________________________________
impossible is only a word

bebeto Profilo | Newbie

prima di tutto grazie per le risposte super veloci...

ho provato come suggerito e funziona,
pero' se inserisco anche gli altri campi:

select IDdis, max(IDmex), campo1 as massimo from messaggi
group by IDdis

ottengo il seguente errore:
Column campo1 is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.



dinoxet Profilo | Senior Member

Scrivi così :


select IDdis, max(IDmex) as massimo, campo1, campo2 from messaggi
group by IDdis, campo1, campo2

inteso??


DINOXET
__________________________________________
impossible is only a word

bebeto Profilo | Newbie

non funziona, infatti quando aggiungo una lista di campi in questo modo:

select IDdis, max(IDmex) as massimo, campo1, campo2 from messaggi
group by IDdis, campo1, campo2

non da' errore, ma mi restituisce tutti i record, senza fare il raggruppamento per IDdis

lbenaglia Profilo | Guru

>mi servirebbe una query che mi restituisse tutti i tipi di IDdis
>una sola volta, e per ogni IDdis selezionati il record con tutti
>i campi aventi IDmex piu' alto

Ciao Andrea,

Per ottenere quel risultato devi ricorrere ad una CTE oppure ad una tabella derivata che restituisca il massimo IDmex per ogni IDdis ed eseguire una INNER JOIN con la tabella base per recuperare i valori delle altre colonne:

USE tempdb; CREATE TABLE dbo.foo( IDmex int NOT NULL PRIMARY KEY, IDdis int NOT NULL, campo1 char(1) NOT NULL, campo2 char(1) NOT NULL, campo3 char(1) NOT NULL, campo4 char(1) NOT NULL ); INSERT dbo.foo VALUES (1, 2, 'a', 'a', 'a', 'a') , (2, 2, 'b', 'b', 'b', 'b') , (3, 3, 'c', 'c', 'c', 'c') , (4, 4, 'd', 'd', 'd', 'd') , (5, 4, 'e', 'e', 'e', 'e'); WITH CTE_GetKey(IDdis,IDmex) AS ( SELECT IDdis, MAX(IDmex) FROM dbo.foo GROUP BY IDdis ) SELECT F.* FROM dbo.foo AS F JOIN CTE_GetKey AS C ON F.IDmex = C.IDmex AND F.IDdis = C.IDdis ORDER BY C.IDmex; /* Output: IDmex IDdis campo1 campo2 campo3 campo4 ----------- ----------- ------ ------ ------ ------ 2 2 b b b b 3 3 c c c c 5 4 e e e e (3 row(s) affected) */ DROP TABLE dbo.foo;

>Vi ringrazio se sapermi dare una risposta anche se negativa.
Prego.

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

bebeto Profilo | Newbie

funziona perfettamente con le CTE, grazie 1000
Bebeto
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5