PDA

Visualizza la versione completa : [ACCESS] Query SQL con raggruppamento basato su valore massimo


arti86
13-05-2006, 12:42
Ciao,avrei un problema relativo ad una query sql in access. Ho una tabella con campi simile alla seguente

CAMPI: CODICE NUMERO NOTE
1000 2 blablabla
1000 1 ciao
1054 3 fdoshfshf
1054 2 dfaefv
1054 1 ryrtyjk
1076 1 bbcvb

ovviamente la mia è una ricostruzione banale del problema; i record sono ordinati in modo crescente secondo codice e in modo decrescente secondo numero; praticamente devo prendere per ogni singolo codice la prima riga, cioè quella con il NUMERO maggiore (perchè ultima ad essere stata inserita).
Vi sarei molto grato riusciste ad aiutarmi.

Grazie

sspintux
13-05-2006, 14:39
Originariamente inviato da arti86 .....

Ho una tabella con campi simile alla seguente

CAMPI: CODICE NUMERO NOTE
1000 2 blablabla
1000 1 ciao
1054 3 fdoshfshf
1054 2 dfaefv
1054 1 ryrtyjk
1076 1 bbcvb

.....i record sono ordinati in modo crescente secondo codice e in modo decrescente secondo numero; praticamente devo prendere per ogni singolo codice la prima riga, cioè quella con il NUMERO maggiore (perchè ultima ad essere stata inserita).
..........
Grazie

select Codice, Max(Numero) from Tabella group by codice

... però mi sembra troppo banale; forse mi sfugge qualcosa ?

EDIT

.. ecco cosa mi sfuggiva :)
.... praticamente devo prendere per ogni singolo codice la prima riga...

non l'ho provata ma dovrebbe andare



Select T.*, Q.* from
Tabella T
inner join
(select Codice , Max(Numero) as MaxNumero from Tabella group by codice) as Q
on T.Codice=Q.Codice AND T.Numero=Q.MaxNumero


P.S.
- presuppone che ci sia un solo NUMERO massimo
- la select .. max(numero)... potresti registrala come query sul db

HTH sspintux

sspintux
13-05-2006, 15:52
Originariamente inviato da sspintux
....forse mi sfugge qualcosa ?


chiedo scusa...
....ho corretto la risposta precedente troppo tardi :sonno:
per cui ne riporto l'essenziale in una nuova

.. ecco cosa mi sfuggiva :
.... praticamente devo prendere per ogni singolo codice la prima riga...

non l'ho provata ma dovrebbe andare



Select T.*, Q.* from
Tabella T
inner join
(select Codice , Max(Numero) as MaxNumero from Tabella group by codice) as Q
on T.Codice=Q.Codice AND T.Numero=Q.MaxNumero

arti86
14-05-2006, 11:15
Ciao, ti ringrazio per l'aiuto, ho qualche difficoltà però a capire la logica della query. Come mai usa un join? Ti chiedo scusa ma potresti spiegarmi a parole il suo funzionamento?

Grazie ancora

sspintux
14-05-2006, 15:41
Ci provo anche se non sono molto bravo a spiegare;

se esegui questa da sola:

select Codice , Max(Numero) as MaxNumero from Tabella group by codice

con i tuoi dati

CAMPI: CODICE NUMERO NOTE
1000 2 blablabla
1000 1 ciao
1054 3 fdoshfshf
1054 2 dfaefv
1054 1 ryrtyjk
1076 1 bbcvb

ottieni :

CODICE MAXNUMERO
1000 2
1054 3
1076 1

immagina ora di materializzarla come una tabella di nome Q
(in effetti potresti salvarla come View/Query in access)

(select Codice , Max(Numero) as MaxNumero from Tabella group by codice) as Q

... ed a questo punto mi pare superfluo aggiungere altro

HTH sspintux

arti86
14-05-2006, 22:58
Ciao, sto impazzendo. A parte il fatto sembra sia un problema che si verifica in modo diverso in base alla versione di access.
Comunque quando cerco di eseguire la query aggiungendo anche il campo note mi da il seguente messaggio: "impossibile eseguire una query che non include l'espressione "note" specificata come parte di una funzione di aggregazione".

Aiutatemiiiiiiiiiiiiiiiii

sspintux
14-05-2006, 23:42
Originariamente inviato da arti86
Ciao, sto impazzendo. A parte il fatto sembra sia un problema che si verifica in modo diverso in base alla versione di access.
Comunque quando cerco di eseguire la query aggiungendo anche il campo note mi da il seguente messaggio: "impossibile eseguire una query che non include l'espressione "note" specificata come parte di una funzione di aggregazione".

Aiutatemiiiiiiiiiiiiiiiii


....dal messaggio di errore sembra che tu abbia ''sbagliato" a scrivere la query,
ma potrebbe anche dipendere dal fatto (che prima non avevo notato)
che "Note" è un nome riservato in access e quindi va scritto tra parentesi quadre
se usato come nome di campo.

In conclusione puoi mostrarci la query ?

arti86
15-05-2006, 08:15
SELECT max([commessa]) AS comme, [codice], [note]
FROM tabella1
GROUP BY [codice];

sspintux
15-05-2006, 13:59
....è ovvio che così non può funzionare (ed il messaggio di errore è molto chiaro)

....ma hai letto quello che ho cercato , senza dubbio molto male, di spiegare ?

la query che devi usare è quella con gli inner join che ti ho già postato.

HTH sspintux

arti86
15-05-2006, 14:03
Ciao, scusa, il fatto è che non capivo perchè avrei dovuto usare un join. provo e ti faccio sapere.

Grazie

Loading