Newsgroup: it.comp.appl.access
Titolo: Scovare il massimo con una query

Ciao a tutti.
Ho una tabella fatta così
tabLotti
idLotto (Primary)
numLotto (int)
ditta (testo)
prezzo (int)
idLotto    numLotto    ditta    prezzo
1                1                A           2
2                1                B            4
3                2                A            3
4                2                B            1
Devo riuscire ad effettuare una query che estragga la ditta con il prezzo
più alto. Ci sono riuscito con due query: la prima mi estrae il numlotto e
il max(prezzo). La seconda si basa su questa con un join su numero lotto e
con una condizione where prezzo = max(prezzo). Ma non sarebbe possibile fare
la ricerca con una sola query?
Thanx
giaconet

 wrote in message
news:jADk8.72223$Ns4.2...@news2.tin.it...

SELECT ditta FROM tabella WHERE prezzo=(SELECT MAX(prezzo) FROM tabella;)
GROUP BY DITTA;
HTH.
Alessandro
PS: ovviamente, se ci sono più ditte con lo stesso prezzo massimo, la query
te le ritorna tutte.

 Alessandro
No, scusa sono stato io poco chiaro. Il problema č che voglio tutte le ditte
con il prezzo max nei singoli lotti.
Rifacendomi all'esempio che ho fatto sopra, la query dovrebbe restituirmi:
numLotto    ditta    prezzo
1                 B        4
2                 A        3
perciň uso 2 query. La prima mi tira fuori
numLotto max(prezzo)
1                4
2                3
la seconda, per ogni lotto, la ditta dove prezzo = max(prezzo).
Cmq, grazie.
Bye
giaconet

 wrote in message

La cosa cambia poco, devi raggruppare anche per lotto oltre che per ditta.
Sib

"Sib" <si...@SPAMMiol.it> ha scritto nel messaggio
news:8MHk8.72959$Ns4.2...@news2.tin.it...

Dopo innumerevoli tentativi ci sono riuscito, spiego.
Se faccio
SELECT ditta FROM tabLotti WHERE prezzo=(SELECT MAX(prezzo) FROM tabLotti;)
GROUP BY ditta;
come consigliatomi da Alessandro, tiro fuori la ditta con il prezzo piů alto
(nell'esempio la ditta B) e non č quello che voglio.
Se faccio
SELECT ditta FROM tabLotti WHERE prezzo=(SELECT MAX(prezzo) FROM tabLotti;)
GROUP BY ditta, numLotto;
il risultato č lo stesso (del resto il risultato del SELECT interno č sempre
il prezzo piů alto in assoluto).
Se provo
SELECT ditta FROM tabLotti WHERE prezzo=(SELECT MAX(prezzo) FROM tabLotti
GROUP BY numLotto;);
la query mi ritorna un errore: "La sottoquery puň restituire al massimo un
record."
L'errore č dovuto, secondo me, al fatto che il SELECT interno restituisce
piů di un risultato (restituisce infatti l'elenco dei massimi per numero di
lotto) e fare prezzo = "recordset" non č corretto.
Ci vuole un join, infatti utilizzando 2 query risolvo cosě
qryMax: SELECT DISTINCTROW numLotto, Max(Prezzo) AS MaxDiPrezzo FROM
tabLotti GROUP BY numLotto; (Elenco dei lotti con i rispettivi massimi)
qryMaxDitte: SELECT qryMax.numLotto, MaxDiPrezzo, ditta FROM qryMax INNER
JOIN tabLotti ON qryMax.numLotto = tabLotti.numLotto WHERE MaxDiPrezzo =
prezzo; (Elenco con numero lotto, Prezzo massimo e ditta/e corrispondenti)
Bastava raggrupparle ed ecco:
SELECT numLotto, MaxDiPrezzo, ditta FROM (SELECT numeroLotto As numLotto,
Max(prezzo) AS MaxDiPrezzo FROM tabLotti GROUP BY numeroLotto) AS qryMax
INNER JOIN tabLotti ON tabLotti.numeroLotto = qryMax.numLotto WHERE
prezzo=MaxDiPrezzo;
Cmq, grazie a tutti.
giaconet

 prezzo=MaxDiPrezzo;
Mi fa piacere che hai capito da solo, non avevo neanche notato che
Alessandro aveva messo una sottoquery piu' dannosa che inutile.
In ogni caso dire "grazie *comunque*" lo trovo poco corretto. Bisogna
infatti ammettere che hai avuto due spunti importanti che ti hanno portato
alla soluzione (quello di alessandro e il mio) seppure volutamente
incompleti.
Non trascuriamo il fatto che, oltre al problema del tempo insufficiente per
dare risposte complete, questo e' un ng il cui scopo non e' quello di dare
il pesce, ma di aiutare a pescarselo da solo.
Sib

 più alto.
C'è un modo meno "dannoso" per farlo?
Alessandro



amen
Saluti.
Emanuele.

 ha scritto nel messaggio

Of course:
L'SQL:
SELECT ditta FROM tabella WHERE prezzo=(SELECT MAX(prezzo) FROM tabella;)
GROUP BY DITTA;
andava scritto:
SELECT tabella.ditta, tabella.numLotto, Max(tabella.Prezzo) AS PrezzoMassimo
FROM tabella
GROUP BY tabella.ditta, tabella.numLotto;
Comunque cio' non toglie che il tuo abbia rappresentato un buon spunto per
il nostro amico, come ho gia' detto.
Sib

 GROUP BY tabella.ditta, tabella.numLotto;
Ma, scusa, cosě ottieni il prezzo massimo di ogni lotto di ogni ditta, non
"la ditta con il prezzo piů alto". Quello che voglio dire č che la tua
soluzione č giustissima per risolvere quello che giaconet "aveva in mente",
non quello che "ha chiesto" (o almeno a me pare che abbia chiesto) con il
suo primo post.
Regards.
Alessandro

 suo primo post.
Rileggendolo devo dire che hai ragione, non "chiedeva" cio' che aveva in
mente.
Piu' che altro avevo intuito cosa voleva a prescindere da come si esprimeva.
Sib

 Piu' che altro avevo intuito cosa voleva a prescindere da come si
esprimeva.
Beh, io non sono ancora cosě bravo ;-)
Buona giornata.
Alessandro