Problema query access

mercoledì 06 novembre 2013 - 01.44
Tag Elenco Tags  Windows XP  |  Access (.mdb)  |  Office 2007

paotur Profilo | Newbie

Salve a tutti. Premesso che non sono una cima in SQL... sto perdendo la testa per la creazione di una query in access.

Ho tre tabelle.

TABELLA VENDITE- campi: cod_prodotto, data_vendita, QT, etc...

TABELLA RIGHE_ORDINI - campi: cod_prodotto, num_prog_ordine, costo_prodotto, etc...

TABELLA TESTA_ORDINI - campi: num_prog_ordine, data_spunta, etc...

Ho la necessità di estrapolare il costo di un prodotto(costo_prodotto), con la data di acquisto (data_spunta) subito antecedente a quella della vendita (data_vendita).

Se eseguo la seguente query:

SELECT VENDITE.cod_prodotto, VENDITE.data_vendita, VENDITE.QT
FROM VENDITE, RIGHE_ORDINI, TESTA_ORDINI,
(SELECT r.cod_prodotto, max(t.data_spunta) AS maxdate FROM RIGHE_ORDINI AS R, TESTA_ORDINI AS T WHERE R.num_prog_ordine=T.num_prog_ordine And r.qt>0 GROUP BY r.cod_prodotto) AS tabmaxdata
WHERE VENDITE.cod_prodotto=RIGHE_ORDINI.cod_prodotto And RIGHE_ORDINI.cod_prodotto=tabmaxdata.cod_prodotto And TESTA_ORDINI.data_spunta=tabmaxdata.maxdate
GROUP BY VENDITE.cod_prodotto, VENDITE.data_vendita, VENDITE.QT;

ottengo una lista di tutti i prodotti con accanto la data di acquisto più recente. non appena includo il campo costo_prodotto nella SELECT iniziale, dal momento che i costi di acquisto sono tanti il numero dei record della join mi si moltiplicano restituendomi un numero di record enorme.

So bene che la inner join in access può essere scritta in maniera più... elegante con gli ON invece dei WHERE ma credo che questo cambi poco ai fini pratici.

Qualcuno può mettermi sulla buona strada e spiegarmi dove sbaglio?

Grazie.

Paolo

CorriCorrado Profilo | Junior Member

Ciao e benvenuto,

>ottengo una lista di tutti i prodotti con accanto la data di
>acquisto più recente. non appena includo il campo costo_prodotto
>nella SELECT iniziale, dal momento che i costi di acquisto sono
>tanti il numero dei record della join mi si moltiplicano restituendomi
>un numero di record enorme.

Secondo me il tuo problema è prima di tutto logico; se vuoi il prezzo di acquisto, dovrai selezionare il prezzo di acquisto che si riferisce al lotto venduto.
Per capire quanto ti è costato il prodotto, dovrai costruire una query in grado di calcolare la media ponderata del costo del prodotto, secondo la logica di gestione del tuo magazzino (LIFO o FIFO); dalla frase mi sembra che tu gestisca LIFO (last input first output, ossia, l'ultimo acquisto è il primo ad uscire).

Ciao
Corrado


Corrado

paotur Profilo | Newbie

Ciao, grazie intanto per la risposta.

scusa, ma non ti seguo. forse ho spiegato male il mio problema o più probabilmente non ho fornito tutte le info necessarie.

un negozio acquista un prodotto X dal suo fornitore.
il prodotto viene acquistato più volte a settimana. Quindi avrò un carico merce il martedì, uno il giovedì ed uno ad esempio il sabato. Ogni carico di questo prodotto (tabella righe ordini) ha una data di acquisto (data_spunta) ed un costo di acquisto relativo a quella particolare data (costo prodotto).
compro spaghetti barilla, in data 1/11/13 a 0,25euro, in data 3/11/13 a 0,30euro, in data 5/11/13 a 0,27euro.
Fin qui spero sia chiaro.
Ora io necessito di una lista dove per ogni prodotto che ho venduto (al dettaglio, al cliente finale) accanto mi trovi la data di acquisto e il costo pagato. Cioè io desidero una lista come la seguente:

basta barilla, acquistato 1/11/13, 0,25 euro, venduta in data 2/11/13
basta barilla, acquistato 3/11/13, 0,30 euro, venduta in data 5/11/13
basta barilla, acquistato 5/11/13, 0,27 euro, venduta in data 12/11/13

per questo motivo con il campo maxdate trovo la data più recente di acquisto.

non appena includo il campo costo prodotto nella inner join la query mi restituisce invece una specie di prodotto cartesiano...

basta barilla, acquistato 1/11/13, 0,25 euro, venduta in data 2/11/13
basta barilla, acquistato 1/11/13, 0,30 euro, venduta in data 2/11/13
basta barilla, acquistato 1/11/13, 0,27 euro, venduta in data 2/11/13
basta barilla, acquistato 3/11/13, 0,25 euro, venduta in data 5/11/13
basta barilla, acquistato 3/11/13, 0,30 euro, venduta in data 5/11/13
basta barilla, acquistato 3/11/13, 0,27 euro, venduta in data 5/11/13
basta barilla, acquistato 5/11/13, 0,25 euro, venduta in data 12/11/13
basta barilla, acquistato 5/11/13, 0,30 euro, venduta in data 12/11/13
basta barilla, acquistato 5/11/13, 0,27 euro, venduta in data 12/11/13

Per concludere non desidero il costo medio di quel prodotto ma proprio l'ultimo costo di acquisto prima dell'ultima vendita e questo per ogni singola vendita effettuata.

grazie.

CorriCorrado Profilo | Junior Member

Ciao,
puoi inserire un DB di esempio?

Grazie

Corrado

paotur Profilo | Newbie

ciao, intendi un database in allegato o un esempio scritto con le tabelle riportate?

sempre grazie

Paolo

CorriCorrado Profilo | Junior Member

ciao, un DB in allegato, anche senza dati
Corrado
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5