Newsgroup: it.comp.appl.access
Titolo: Query con ragguppamento per articolo ed 'ultimo ricarico' eseguito

Dispongo di due tabelle, DOCUMENTITESTATE e DOCUMENTIRIGHE
La DOCUMENTIRIGHE e' collegata alla DOCUMENTITESTATE attraverso il campo 
ID_DOCUMENTITESTATE
Nella DOCUMENTITESTATE sono presenti anche i campi DATA_DOCUMENTO e 
NUMERO_DOCUMENTO
Nella DOCUMENTIRIGHE sono presenti anche i campi CODICE_ARTICOLO, 
QUANTITA, PREZZO, PERCENTUALE_RICARICO
Vorrei realizzare una query che mi restituisca tante righe, una sola per 
ogni articolo diverso, dove appaiano i campi DATA_DOCUMENTO, 
NUMERO_DOCUMENTO, CODICE_ARTICOLO, QUANTITA_PREZZO, PERCENTUALE_RICARICO 
dell'ultimo documento in ordine cronologico (DATA_DOCUMENTO piu' alta 
delle altre)
In sostanza la query dovrebbe restituire "le percentuali ricarico piu' 
recenti usate su ogni articolo"
Qualche consiglio?


io farei così
- faccio una prima query in cui raggruppo tutti gli articoli e trovo per ogni articolo la data più recente di caricamento.
 
SELECT Max(DocTestate.DataDoc) AS MaxDiDataDoc, DocRighe.CodArt
FROM DocRighe INNER JOIN DocTestate ON DocRighe.idDoc = DocTestate.idDoc
GROUP BY DocRighe.CodArt
 
- però non sei sicuro che un documento contenga più volte lo stesso articolo quindi...
trovi per ogni coppia Articolo, MaxDataDoc il massimo idRiga (sperando che tu abbia questo campo)
 
SELECT Max(DocRIghe.idRiga) AS MaxIdRiga, DocRighe.CodArt
FROM (DocRighe INNER JOIN DocTestate ON DocRighe.idDoc = DocTestate.idDoc) INNER JOIN (
 
SELECT Max(DocTestate.DataDoc) AS MaxDiDataDoc, DocRighe.CodArt
FROM DocRighe INNER JOIN DocTestate ON DocRighe.idDoc = DocTestate.idDoc
GROUP BY DocRighe.CodArt
 
) AS DocRighe1 ON (DocTestate.DataDoc = DocRighe1.MaxDiDataDoc) AND (DocRighe.CodArt = DocRighe1.CodArt)
GROUP BY DocRighe.CodArt
 
- a questo punto hai per ogni articolo l'idRiga che cerchi e puoi ricavare il rincaro corrispondente
 
SELECT DocRighe.CodArt, DocRighe.Rincaro, DocTestate.DataDoc
FROM (DocRighe INNER JOIN DocTestate ON DodRighe.idDoc = DocTestate.idDoc) INNER JOIN (
 
SELECT Max(DocRIghe.idRiga) AS MaxIdRiga, DocRighe.CodArt
FROM (DocRighe INNER JOIN DocTestate ON DocRighe.idDoc = DocTestate.idDoc) INNER JOIN (
 
SELECT Max(DocTestate.DataDoc) AS MaxDiDataDoc, DocRighe.CodArt
FROM DocRighe INNER JOIN DocTestate ON DocRighe.idDoc = DocTestate.idDoc
GROUP BY DocRighe.CodArt
 
) AS DocRighe1 ON (DocTestate.DataDoc = DocRighe1.MaxDiDataDoc) AND (DocRighe.CodArt = DocRighe1.CodArt)
GROUP BY DocRighe.CodArt
 
) AS DocRIghe2 ON DocRighe.idRiga = DocRighe2.MaxIdRiga
 
anche se per ogni doc non hai ripetizioni di articoli, ti sconsiglio di calcolare MaxIdRiga direttamente all'inizio, 
perchè almeno nel mio caso capita che un documento venga caricato in ritardo quindi abbia id alto ma data anteriori a tanti altri record...
 
spero di essere stato chiaro!
M
 
 
 


Ringrazio molto per l'interessamento
Chiaro sei stato chiaro
Ma l'obiettivo, ammesso sia possibile, era ottenere tutto con una sola 
sciabolata


devi usare l'ultima query. una sola query.


Certo scusa ma non avevo posto la dovuta attenzione
Perfetto, ho sistemato tutti i campi col nome corrispondente al mio db 
ed e' andata al primo colpo, una cannonata
Molte grazie, stavo quasi abbandonando l'impresa
Posso chiederti che ragionamento hai seguito per mettere giu' una query, 
che a mio avviso entra nel range delle query complesse, di questo tipo?
 
 


scusa, ma a me viene naturale... 
però pensandoci devi leggere i tre passaggi al contrario.
a te serve sapere gli idriga di alcuni record. ok.
come me li trovo? devo costruirmi una riga che raggruppi gli articoli e trovi i record con le date più recenti.
ok. ma a me serve un id, no le date. allora faccio la seconda query....