Somma interattiva di record

di il
6 risposte

Somma interattiva di record

Salve.
Utilizzando Access, vorrei calcolare la [Somma] degli ultimi n valori di un dato campo [importo] avente un determinato [nome]:
Ad esempio, la Somma degli ultimi 3 valori (n=3) del campo [importo] per ogni [nome]:

Tabella di partenza:

ID Nome Importo Risultato Somma
1 Tizio 10 null
2 Tizio 20 null
3 Tizio 30 60 (=30+20+10)
4 Tizio 40 90
5 Tizio 50 120
6 Tizio 60 150
7 Caio 70 null
8 Caio 80 null
9 Caio 90 240 (=90+80+70)
10 Caio 100 270
11 Caio 110 300
12 Caio 120 330
13 Caio 130 360

Grazie a chiunque può aiutarmi.

6 Risposte

  • Re: Somma interattiva di record

    In quello che chiedi trovo discordanza con l'esempio che hai portato...!
    
    1 Tizio 10 null
    2 Tizio 20 null
    3 Tizio 30 60 (=30+20+10)
    4 Tizio 40 90
    5 Tizio 50 120
    6 Tizio 60 150
    ....
    Se, come dici vuoi solo le somme degli ultimi 3... non si capisce perchè il 3° dato abbia la somma... quelli sono i primi 3 non gli ultimi... ma come vedi è opinabile in base a cosa ritieni oggetto di ORDINAMENTO.
    Poi per somma degli ultimi 3 intendi la somma di tutti VISUALIZZATA solo per gli ultimi 3, oppure la somma degli ultimi 3...?
    Sono concetti molto differenti, ed in taluni casi non praticabili.

    Realmente quello che chiedi non è fattibile, puoi ottenere la Somma progressiva di tutti e visualizzare solo gli ultimi 3, ma non è gestibile quello che mi pare di aver interpretato... anche se lascia molti spunti al fraintendimento.
  • Re: Somma interattiva di record

    Grazie per la risposta. Hai ragione, non mi sono spiegato bene. Ora ci riprovo.

    La tabella che voglio analizzare è questa ([ID], [NOME], [MESE], [IMPORTO]):

    1, Tizio, Gennaio, 10
    2, Tizio, Febbraio, 20
    3, Tizio, Marzo, 30
    4, Tizio, Aprile, 40
    5, Tizio, Maggio, 50
    6, Caio, Gennaio, 60
    7, Caio, Febbraio, 70
    8, Caio, Marzo, 80
    9, Caio, Aprile, 90
    10, Caio, Maggio, 100

    Ora, da questa tabella, Vorrei effettuare una query il cui risultato diventi questo ([ID], [NOME], [MESE], [SOMMA_ULTIMI_3]):

    1, Tizio, Gennaio, 'null'
    2, Tizio, Febbraio, 'null'
    3, Tizio, Marzo, 60 (... 60=30+20+10)
    4, Tizio, Aprile, 90 (... 90=40+30+20)
    5, Tizio, Maggio, 120 (... 120=50+40+30)
    6, Caio, Gennaio, 'null'
    7, Caio, Febbraio, 'null'
    8, Caio, Marzo, 210 (....210=80+70+60)
    9, Caio, Aprile, 240 (....240=90+80+70)
    10, Caio, Maggio, 270 (....270=100+90+80)

    I primi 2 record di ciascun nome sono 'null' perchè nei primi 2 record non si possono sommare 3 [IMPORTO].

    Grazie se riesci ad aiutarmi.
  • Re: Somma interattiva di record

    Così come vuoi tu non sono in grado di aiutarti, se non con Routine VBA che sarebbero lente...!

    Se vuoi la somma progressiva e poi prendere tutti i Records ad esclusione dei primi 3 per ogni NOME... forse potrebbe essere fattibile lavorandoci parecchio... con solo SQL.
  • Re: Somma interattiva di record

    Approfitto ancora un momento della tua disponibilità, solo per essere sicuro che quello che cerco diventa complesso da ottenere.

    Volevo allegarti un file di Access che contiene alcune Query test che ho fatto io, ma non ci sono riuscito, allora inserisco di seguito le istruzioni SQL relative:

    QueryTest1:
    SELECT Tabella.ID, Tabella.NOME, Tabella.DATA, Tabella.IMPORTO, DSum('[IMPORTO]','TABELLA','[ID]<=' & [ID])-DSum('[IMPORTO]','TABELLA','[ID]<=' & [ID]-3) AS SOMMA_PROGRESSIVA_TEST_1
    FROM Tabella;
    Questa Query funziona, solo che con DB molto grandi diventa lenta perchè ad ogni record somma tutti i precedenti 2 volte (in pratica, alla posizione del record n somma tutti i record fino a quel punto e sottrae tutti i record fino a tre posizioni precedenti). Inoltre, quando cambia il nome, somma anche i record del nome precedente e non segna il valore 'null'.

    QueryTest2:
    SELECT Tabella.ID, Tabella.NOME, Tabella.DATA, Tabella.IMPORTO, DSum('[IMPORTO]','[TABELLA]','[ID] Between 3 And 5') AS SOMMA_PROGRESSIVA_TEST2
    FROM Tabella;
    Questa Query è semplicemente un tentativo: il dominio della somma deve essere, per ogni nome e per ogni progressivo [ID], quello del progressivo compreso tra n-3 e n. Mettendo i numeri, sembra funzionare (ad esempio, between 3 and 5 al progressivo [ID]=5 la somma è correttamente 120.

    QueryTest3:
    SELECT Tabella.ID, Tabella.NOME, Tabella.DATA, Tabella.IMPORTO, DSum('[IMPORTO]','[TABELLA]','[ID] Between [ID]-3 And [ID]') AS SOMMA_PROGRESSIVA_TEST3
    FROM Tabella;
    In questa Query, invece, provo a sostituire 'between 3 and 5' con le variabili 'between [ID]-3 and [ID]', ma il risultato è quello che ottengo la somma complessiva di tutti i record.

    Se ora manca poco a far funzionare il tutto, bene, se no lascia perdere e grazie lo stesso.
  • Re: Somma interattiva di record

    Buona giornata, Cimavalaccia;
    pensavo di risolvere con due Query.
    Nella maschera "Dati" ho inserito tre campi non associati; [Mese_1], [Mase_2], [Mese_3]
    La prima Query di selezione con la seguente struttura:
    Campo:[ID]
    Campo:[Nome] (Senza impostare alcun Criterio di selezione, vengono selezionati tutti i Nominativi, se desideri avere una selezione riferita ad ogni singolo Nominativo, basterà impostare il Criterio di selezione in modo opportuno.)
    Campo:[Mese] ? Criteri: Like [Forms]![Dati]![Mese_1] Or Like [Forms]![Dati]![Mese_2] Or Like [Forms]![Dati]![Mese_3]
    Campo:[Quota]
    l'altra di somma riferita alla prima.
    Campo: [Nome] ? Tabella: NomePrimaQuery ? Formula: Raggruppamento
    Campo: [Quota] ? Tabella: NomePrimaQuery ? Formula: Somma

    Il limite di questa procedura consiste nel fatto che selezioni solo un trimestre per volta, in compenso è molto veloce e flessibile. Vedi Tu se può essere interessante per le Tue esigenze.

    A disposizione.

    Buona serata.

    Giuseppe
  • Re: Somma interattiva di record

    Buongiorno Giuseppe.
    In realtà, al posto del campo [mese] ho un campo [data] che rende tutto più complicato.
    Il fatto è che penso che non dovrebbe essere impossibile, solo che non conosco l'istruzione SQL adeguata.
    Siccome parto da una tabella già ordinata in ordine crescente, ossia rispettivamente per [nome] e per [data], l'ideale sarebbe riuscire, per ogni record avente contatore pari a [id], a sommare i valori del campo [importo] avente il dominio del campo [id] compreso tra [id]-3 e [id].
    La cosa si complica leggermente perchè ad ogni cambio di [nome] i campi [importo] non devono sommarsi fra nomi diversi.
    Utilizzando DSum, inserendo nel criterio l'istruzione '[ID]<=' & [ID]-3 , questa istruzione consente di sommare tutti i valori dall'inizio fino al punto [id]-3, mentre l'istruzione '[ID]<=' & [ID] consente di sommare tutti i valori dall'inizio fino a [id].
    Come è possibile vincolare il dominio della somma ad un punto di inizio [id]-3 e uno di fine [id]?
    Saluti.
Devi accedere o registrarti per scrivere nel forum
6 risposte