SOMMA DI VALORE

di il
7 risposte

SOMMA DI VALORE

Buonasera a tutti,
ho un report che mi estrae il numero di consegne effettuate in un determinato viaggio identificato per numero progressivo. Ogni singolo rigo ha lo stesso numero di consegne con lo stesso numero progressivo e i vari numeri ddt inseriti. Vorrei fare la somma delle consegne effettuate ma solo per singolo viaggio. Mi spiego meglio:

consegne 2, ddt 4567, viaggio nr.180
consegne 2, ddt 58867, viaggio nr. 180

Se eseguo la somma del campo "consegne" il risultato è 4 in realtà il valore giusto è 2 perché il viaggio è sempre lo stesso (numero viaggio 180).
Ho inserito nel report un campo di testo ma non so che tipo di funzione usare per arrivare a quel risultato.

Altro esempio:
consegne 2, ddt 4567, viaggio nr.180
consegne 2, ddt 98567, viaggio nr.180
consegne 3, ddt 123, viaggio nr.181
consegne 3, ddt 749, viaggio nr.181
La somma delle consegne deve essere 5
Grazie per aiuto.
Giuseppe

7 Risposte

  • Re: SOMMA DI VALORE

    Senza saper ne leggere ne scrivere, ma sapendo qualcosa di "Teoria Relazionale dei Dati" (argomento FONDAMENTALE da sapere, se si vuole pasticciare con i database, e senza il quale ci si imbatte in ENORMI PROBLEMI, come questo),

    quello che devi fare e' selezionare la colonna "consegne", la colonna "viaggio" e fare una DISTINCT, che assicura che non ci siano record duplicati.

    Questo introdurra' inevitabilmente altre rogne, che in questo momento non saprei dirti, MA E' CERTO, come il dover pagare le tasse

    I problemi rilevabili fin da subito nel tuo micro esempio sono:

    1) la presenza di campi di testo: ad esempio "viaggio nr.180" E' DIVERSO da "viaggio nr. 180": ESATTAMENTE perche' c'e' uno spazio in piu'/in meno.Il computer NON TOLLERA imprecisioni/approssimazioni
    2) DUPLICAZIONI di dati: "consegne 2", "consegne 3", "viaggio nr.180" e "viaggio nr.181" sono dati DUPLICATI. QUESTO E' MALE, MOOLTO MALE, MALISSIMO, perche' introducono un SACCO di rogne rognose da risolvere

    Ti consigli di approfondire l'argomento: non e' nulla di trascendetale, MA fondamentale.
  • Re: SOMMA DI VALORE

    Grazie per risposta, mi son spiegato male:

    la quantità 2 dell'etichetta consegne è un campo numerico, come anche il nr. viaggio è gestito come campo numerico: il valore è 180 nell'esempio.

    consegne 2, ddt 4567, viaggio nr.180
    consegne 2, ddt 58867, viaggio nr. 180

    Se eseguo la somma del campo "consegne" il risultato è 4 in realtà il valore giusto è 2 perché il viaggio è sempre lo stesso (numero viaggio 180).
    Ho inserito nel report di stampa una casella di testo dove vado a far fare una somma ma non so che tipo di funzione usare per arrivare a quel risultato corretto. La somma funziona ma dà un valore errato.

    Altro esempio:
    consegne 2, ddt 4567, viaggio nr.180
    consegne 2, ddt 98567, viaggio nr.180
    consegne 3, ddt 123, viaggio nr.181
    consegne 3, ddt 749, viaggio nr.181
    La somma delle consegne deve essere 5

    Grazie ancora.
    Giuseppe
  • Re: SOMMA DI VALORE

    giuseppe21965 ha scritto:


    Grazie per risposta, mi son spiegato male:
    ...
    Però ancora non abbiamo capito se il db è normalizzato o meno. Immagino che il report sia associato ad una query. Mostra la SQL di quella query e dicci se nel report hai impostato qualche livello di raggruppamento. Se la query a sua volta è basata su altre query pubblica la SQL anche di quelle.
    Ed andando a monte: come sono le tabelle che stanno all'origine di tutto? In che relazione sono?
  • Re: SOMMA DI VALORE

    Questa è la query usata per fare il report di stampa:
    SELECT dbo_viaggi.przforfait, dbo_viaggi.NRPRG, dbo_viaggi.dbgruppo, dbo_viaggi.qtaconsegne, dbo_viaggi.descrizioneviaggio, dbo_EQListiniPrezzi.PrezzoListino, dbo_EQListiniArticoliRig.IDListino, dbo_EQListiniArticoliRig.CodListino, dbo_ddtviaggi.nrprg, dbo_ddtviaggi.dataviaggio, dbo_ddtviaggi.nrddt, dbo_ddtviaggi.peso, dbo_ddtviaggi.codart, dbo_ddtviaggi.listino, dbo_ddtviaggi.impsingolo, dbo_ddtviaggi.imptot, dbo_ddtviaggi.codcli
    FROM dbo_viaggi INNER JOIN ((dbo_EQListiniArticoliRig INNER JOIN (dbo_EQArtAnagrafiche INNER JOIN dbo_ddtviaggi ON dbo_EQArtAnagrafiche.CodArticolo = dbo_ddtviaggi.codart) ON (dbo_EQListiniArticoliRig.CodArticolo = dbo_EQArtAnagrafiche.CodArticolo) AND (dbo_EQListiniArticoliRig.DBGruppo = dbo_EQArtAnagrafiche.DBGruppo)) INNER JOIN dbo_EQListiniPrezzi ON (dbo_EQListiniArticoliRig.IDListino = dbo_EQListiniPrezzi.IDListino) AND (dbo_EQListiniArticoliRig.DBGruppo = dbo_EQListiniPrezzi.DBGruppo)) ON (dbo_viaggi.codart = dbo_ddtviaggi.codart) AND (dbo_viaggi.codcli = dbo_ddtviaggi.codcli) AND (dbo_viaggi.DATAVIAGGIO = dbo_ddtviaggi.dataviaggio) AND (dbo_viaggi.NRPRG = dbo_ddtviaggi.nrprgtes) AND (dbo_viaggi.dbgruppo = dbo_EQArtAnagrafiche.DBGruppo)
    GROUP BY dbo_viaggi.przforfait, dbo_viaggi.NRPRG, dbo_viaggi.dbgruppo, dbo_viaggi.qtaconsegne, dbo_viaggi.descrizioneviaggio, dbo_EQListiniPrezzi.PrezzoListino, dbo_EQListiniArticoliRig.IDListino, dbo_EQListiniArticoliRig.CodListino, dbo_ddtviaggi.nrprg, dbo_ddtviaggi.dataviaggio, dbo_ddtviaggi.nrddt, dbo_ddtviaggi.peso, dbo_ddtviaggi.codart, dbo_ddtviaggi.listino, dbo_ddtviaggi.impsingolo, dbo_ddtviaggi.imptot, dbo_ddtviaggi.codcli
    HAVING (((dbo_viaggi.NRPRG) Between [Forms]![STAMPA PER ZONA]![Testo93] And [Forms]![STAMPA PER ZONA]![Testo95]) AND ((dbo_viaggi.dbgruppo)=[Forms]![STAMPA PER ZONA]![CasellaCombinata91]) AND ((dbo_ddtviaggi.dataviaggio) Between [Forms]![STAMPA PER ZONA]![Testo79] And [Forms]![STAMPA PER ZONA]![Testo82]) AND ((dbo_ddtviaggi.codart)=[Forms]![STAMPA PER ZONA]![CasellaCombinata84]) AND ((dbo_ddtviaggi.codcli)=[Forms]![STAMPA PER ZONA]![CasellaCombinata99]))
    ORDER BY dbo_ddtviaggi.dataviaggio;
    Le tabelle a monte sono due con una relazione uno a molti. Nel report di stampa non ci sono raggruppamenti.
    giuseppe
  • Re: SOMMA DI VALORE

    DEVI selezionare SOLO le colonne di interesse E ci devi infilare la DISTINCT!

    Ok, che le colonne sono numeriche, MA questo risolve SOLO il problema dei valori 'simili ma non uguali', NON gli altri problemi!
  • Re: SOMMA DI VALORE

    Giuseppe21965,
    credo che tu stia facendo una serie di confusioni:

    giuseppe21965 ha scritto:


    la quantità 2 dell'etichetta consegne è un campo numerico, come anche il nr. viaggio è gestito come campo numerico: il valore è 180 nell'esempio.

    consegne 2, ddt 4567, viaggio nr.180
    consegne 2, ddt 58867, viaggio nr. 180

    Se eseguo la somma del campo "consegne" il risultato è 4 in realtà il valore giusto è 2 perché il viaggio è sempre lo stesso (numero viaggio 180).
    Se vuoi conoscere il numero di consegne, di un determinato viaggio (ad esempio il nr. 180) non devi effettuare la somma ma il loro conteggio.
    Infatti se prendiamo schematicamente la tua tabella conclusiva (denominandola "TabMovimenti")
    
    ID     Consegne           Dtt        NrViaggio
    1      2                  4567         180
    2      2                  98567        180
    3      3                  123          181
    4      3                  749          181
    

    un esempio per determinare il numero delle occorrenze (del NrViaggio = 180) è il seguente:
    
    SELECT TabMovimenti.NrViaggio, Count(TabMovimenti.NrViaggio) AS ConteggioDiNrViaggio
    FROM TabMovimenti
    GROUP BY TabMovimenti.NrViaggio
    HAVING (((TabMovimenti.NrViaggio)=180))
    ORDER BY TabMovimenti.NrViaggio;
    
    in modo da ottenere:
    
    NrViaggio    ConteggioDiNrViaggio
    180          2
    
    Inoltre quando presenti:

    giuseppe21965 ha scritto:



    Altro esempio:
    consegne 2, ddt 4567, viaggio nr.180
    consegne 2, ddt 98567, viaggio nr.180
    consegne 3, ddt 123, viaggio nr.181
    consegne 3, ddt 749, viaggio nr.181
    La somma delle consegne deve essere 5
    è chiaro che per ottenere quel risultato (cinque) vorresti la somma delle consegne (in base al numero di viaggio) ma non facendo riferimento ai Dtt, quindi (come ti è stato indicato) prendendo "distintamente" il NrViaggio (e sommando le consegne prese una sola volta, in quanto queste sono già un risultato totale).
    Un esempio, potrebbe essere il seguente:
    
    SELECT TabMovimenti.NrViaggio
    FROM TabMovimenti
    GROUP BY TabMovimenti.NrViaggio;
    
    che chiameremo, per semplicità: "QueryNrViaggi"; la quale restituirà le occorrenze dei numeri dei viaggi raggruppati, in modo da averli singolarmente
    
    NrViaggio
    180
    181
    
    Questa query verrà posta in relazione con la tabella originaria in modo da ottenere (con la DISTINCT) il numero di consegne
    
    SELECT DISTINCT QueryNrViaggi.NrViaggio, TabMovimenti.Consegne
    FROM TabMovimenti 
    INNER JOIN QueryNrViaggi ON TabMovimenti.NrViaggio = QueryNrViaggi.NrViaggio;
    
    e la chiameremo "QuerySingoli" in modo da ottenere il numero di consegne (prese distintamente)
    
    NrViaggio       Consegne
    180             2     
    181             3
    
    A questo punto se si vuole il totale del numero di consegne (indipendentemente dal numero di viaggio) è sufficiente effettuare (in base alla query precedente) la loro somma:
    
    SELECT Sum(QuerySingoli.Consegne) AS SommaDiConsegne
    FROM QuerySingoli;
    
    ottenendo:
    
    SommaDiConsegne
    5
    
    Ti ho evidenziato i passaggi basici delle varie query che possono essere implementati sfruttando (se ne hai padronanza) il tutto in una singola query, che abbia l'annidamento relativo (attraverso sub-query con tabelle derivate) per ottenere in sequenza i vari step.
  • Re: SOMMA DI VALORE

    Grazie a tutti, ho risolto tramite subquery e funziona.
Devi accedere o registrarti per scrivere nel forum
7 risposte