Condividi tramite

somma progressivo

Anonimo
2016-09-12T16:52:33+00:00

ciao a tutti,

ho posto tempo fa un quesito per il quale Sandro Peruz mi ha gentilmente aiutato nella soluzione che è questa:

SELECT t.id_somma

          , t.descrizione

         , t.data, t.nrLezioni

         , sum(t1.nrlezioni) as sommaPR

from

      t_somma as t

inner join

       t_somma as t1

on 

        format(t.data,"yyyymmdd") &  format(t.id_somma,"000000")>=  format(t1.data,"yyyymmdd") &  format(t1.id_somma,"000000")

group by

          t.id_somma, t.descrizione, t.data,t.nrLezioni

order by

         t.data, t.id_somma

questa query mi restituisce la somma progressiva di NrLezioni della t_somma

Io vorrei inserire nella tabella t_somma il campo IdSt e vorrei che il progressivo SommaPr non venisse calcolato per tutta la tabella ma ricominciasse da zero per ogni IdSt

E' possibile?

Ringrazio per l'aiuto

Microsoft 365 e Office | Accesso | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2016-09-13T20:31:38+00:00

    ciao Paolo,

    dopo questo accorato appello non posso esimermi dalll' intervenire :-).

    la cosa che mi preoccupa maggiormente è il numero di righe della tua tabella, le performance che ne derivano, nonché la crescite esponenziale delle stesse, tutto questo, riallacciandomi al 3d precedente.

    Dalla tabella discussa in precedenza :

    ottieni questo :

    con questi due statements :

    SELECT t1.id_somma, t1.id_studente, t1.nrLezioni, t1.data, sum(t2.nrLezioni) AS sommaR

    FROM

             t_Somma32 AS t1 INNER JOIN t_somma32 AS t2 ON (t2.data<=t1.data) AND (t2.id_studente=t1.id_studente)

    GROUP BY

                   t1.id_somma, t1.id_studente, t1.nrLezioni, t1.data

    ORDER BY

              t1.data;


    SELECT t.id_somma, t.id_studente, t.descrizione, t.data, t.nrLezioni, t.nrLezioni

                 (select sum(t1.nrlezioni)

               from

                    t_Somma32 as t1

             where

                     t1.id_studente=t.id_studente and t1.data<=t.data ) AS sommaPR

    FROM

               t_Somma32 AS t

    ORDER BY t.id_studente, t.data;


    Con access non hai la possibilità di applicare partitioning e windowing, funzioni native in SqlServer ad esempio, che permettono esecuzioni rapidissime nel caso di runningSum applicate a tabelle con molte righe.

    Prova il secondo,  e facci sapere :-)

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-09-15T05:45:48+00:00

    ciao Paolo,

    ok, prova in questo modo :

    SELECT t.ID, t.IdSt, t.importo, t.data, t.IdCorso, t.nrLezioni, DocenteID, TipoCorsoID, Assenza, AssenzaRU, (select sum(t1.nrlezioni)

               from

                    TblGenerale3 as t1

             where

                     t1.IdSt=t.IdSt and t1.data<=t.data ) AS sommaPR  INTO TblGenerale3PR

    FROM TblGenerale3 AS t

    ORDER BY t.IdSt, t.data;

    [...]

    Innanzitutto Ti devo fare i complimenti, perchè la query che mi hai proposto, anche con la mia tabella di 9.200 record, è velocissima. Il problema di velocità lo trovo invece nelle query successive.

    [...]

    beh, 9,200 non sono moltissime righe....dai miei test, con 60,000-70,000 righe la cosa è ancora gestibile, effettuando test con 150,000 righe...mmmm....un po' meno :-)

    [...]

    Ti ringrazio molto.

    Paolo

    [...]

    prego e buona giornata.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-09-15T04:58:28+00:00

    ciao Sandro,

    scusa se ritorno sull'argomento.

    Innanzitutto Ti devo fare i complimenti, perchè la query che mi hai proposto, anche con la mia tabella di 9.200 record, è velocissima. Il problema di velocità lo trovo invece nelle query successive.

    Il programma completo che ho scritto è questo:

    SELECT t.ID, t.IdSt, t.importo, t.data, t.IdCorso, t.nrLezioni, DocenteID, TipoCorsoID, Assenza, AssenzaRU, (select sum(t1.nrlezioni)

               from

                    TblGenerale3 as t1

             where

                     t1.IdSt=t.IdSt and t1.data<=t.data ) AS sommaPR

    FROM TblGenerale3 AS t

    ORDER BY t.IdSt, t.data;

    Per ovviare a questo problema vorrei creare una tabella di appoggio (TblGenerale3PR), evitando però di fare una seconda query di creazione tabella. E' possibile farlo direttamente? Mi puoi indicare la sintassi?

    Ti ringrazio molto.

    Paolo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-09-14T05:56:16+00:00

    Ciao Sandro,

    grazie mille! ora funziona correttamente. Mi sei stato di grande aiuto.

    Riguardo la tua preoccupazione sulla lentezza dell'elaborazione effettivametne è un problema. Per questo motivo ho rinunciato alla visualizzazione dei saldi sulla maschera.

    I saldi mi servono una volta al mese per calcolare il premio del responsabile. Ho deciso di creare, con la query, una tabella di appoggio, per la creazione della quale, chiaramete Access ci mette del tempo, ma l'elaborazione può essere fatta anche in orario non lavorativo.

    Buon lavoro e grazie ancora :)

    Paolo

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-09-13T20:03:27+00:00

    ciao Sandro,

    ho provato a studiare il caso pubblicato in web.mclink.it/MC5854/ per vedere se riuscivo a capirci qualcosa per adattarlo alle mie esigenze.

    Modificando in questo modo le istruzioni:

    SELECT Tab1.IdMovimento, First(Tab1.IDProdotto) AS IDProdotto, Tab1.DataMovimento, First(Tab1.Quantita) AS Quantita, SUM(Tab2.Quantita) AS Progressivo

    FROM tblMovimenti AS Tab1 INNER JOIN tblMovimenti AS Tab2 ON Format(Tab1.Datamovimento,"yyyymmdd") & Format(Tab1.IdProdotto,"000000")>=Format(Tab2.Datamovimento,"yyyymmdd") & Format(Tab2.IdProdotto,"000000")

    GROUP BY Tab1.IdProdotto, Tab1.DataMovimento, Tab1.IdMovimento

    ORDER BY Tab1.IdProdotto, Tab1.DataMovimento, Tab1.IdMovimento;

    ottengo questo:

    la tabella è ordinata correttamente per IdProdotto/DataMovimento, ma il progressivo dovrebbe invece essere così:

    Sono sicuro che Access permette di ottenere questo risultato, ma non riesco a capire come ci si può arrivare.

    Se mi potessi aiutare Ti sarei molto grato.

    Grazie mille per l'attenzione

    Paolo

    La risposta è stata utile?

    0 commenti Nessun commento