Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [ACCESS] Somme da due tabelle

    Buon giorno, ho un semplice DB Access con 3 tabelle.
    La gestione è un classico carico/scarico merci.
    Il db è ancora in fase embrionale, sto sviluppando query di controllo e di supporto per il futuro.

    Le tabelle sono:
    tbCarico,tbScarico e tbProdotto dove le prime 2 sono legate a tbProdotto in una relazione 1 ad N

    1 prodotto --> N carichi
    N scarichi


    Ho tre varianti della stessa query , ma solo una mi da i valori giusti

    1. Somme calcolate male
    codice:
    Select CARICO,SCARICO from ( SELECT Sum(tbCarico.QUANTITA_CARICO) AS CARICO, Sum(tbScarico.QUANTITA_SCARICO) AS SCARICO FROM (tbProdotto INNER JOIN tbCarico ON tbProdotto.COD_PRODOTTO = tbCarico.COD_PRODOTTO) INNER JOIN tbScarico ON tbProdotto.COD_PRODOTTO = tbScarico.COD_PRODOTTO where (tbProdotto.COD_PRODOTTO = tbScarico.COD_PRODOTTO AND tbProdotto.COD_PRODOTTO = tbCarico.COD_PRODOTTO) )

    2. Somme calcolate male
    codice:
    SELECT Sum(tbCarico.QUANTITA_CARICO) AS TOT_QUANTITA_CARICO, Sum(tbScarico.QUANTITA_SCARICO) AS TOT_QUANTITA_SCARICO, tbProdotto.DESCRIZIONE FROM (tbProdotto INNER JOIN tbCarico ON tbProdotto.COD_PRODOTTO = tbCarico.COD_PRODOTTO) INNER JOIN tbScarico ON tbProdotto.COD_PRODOTTO = tbScarico.COD_PRODOTTO GROUP BY tbProdotto.DESCRIZIONE ORDER BY tbProdotto.DESCRIZIONE;

    3. UNION. Somme giuste ma vorrei che fosse un solo record con 2 colonne riportanti le somme
    codice:
    SELECT Sum(C.QUANTITA_CARICO) AS SumOfQUANTITA_CARICO, P.DESCRIZIONE FROM tbProdotto AS P INNER JOIN tbCarico AS C ON P.COD_PRODOTTO = C.COD_PRODOTTO GROUP BY P.DESCRIZIONE; UNION SELECT Sum(S.QUANTITA_SCARICO) AS SumOfQUANTITA_SCARICO, P2.DESCRIZIONE FROM (tbProdotto AS P2 INNER JOIN tbScarico AS S ON P2.COD_PRODOTTO = S.COD_PRODOTTO) GROUP BY P2.DESCRIZIONE;

    Dove sbaglio nelle prime 2 ? come posso invece modificare la terza query per avere un solo record ?

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Hai pensato MOLTO bene alla opportunita di fare una unica
    tabella per i "Carichi e Scarichi" aggiungendo un campo
    per distinguere appunto il carico dallo scarico ???
    __________________________________________________ _______


    Comunque con la tua attuale strutura potresti immaginare 2 soluzioni

    la 1° ( a parer mio migliore )
    - Raggruppa e somma sulla tabella "tbCarico"
    - Raggruppa e somma sulla tabella "tbScarico"
    - Mette in Join le 2 sopra e la tabella "tbProdotto"
    codice:
    SELECT 
    tbProdotto.COD_PRODOTTO, 
    tbProdotto.DESCRIZIONE, 
    CC.SuCar, 
    SS.SuSca
    FROM 
    (
    tbProdotto 
    LEFT JOIN 
    (
    SELECT 
    tbCarico.COD_PRODOTTO, 
    Sum(tbCarico.QUANTITA_CARICO) AS SuCar 
    FROM 
    tbCarico 
    GROUP BY 
    tbCarico.COD_PRODOTTO
    )  AS CC 
    ON 
    tbProdotto.COD_PRODOTTO = CC.COD_PRODOTTO
    ) 
    LEFT JOIN 
    (
    SELECT 
    tbScarico.COD_PRODOTTO, 
    Sum(tbScarico.QUANTITA_SCARICO) AS SuSca 
    FROM 
    tbScarico 
    GROUP BY 
    tbScarico.COD_PRODOTTO
    )  AS SS 
    ON 
    tbProdotto.COD_PRODOTTO = SS.COD_PRODOTTO
    ;



    la 2°
    - Unisce la tabelle "tbCarico" e "tbScarico" con un distintivo ("CS")
    - mette in Join con "tbProdotto"
    - Raggruppa per "COD_PRODOTTO" e "CS" e somma le Quantita
    codice:
    SELECT 
    tbProdotto.COD_PRODOTTO, 
    tbProdotto.DESCRIZIONE, 
    Sum(IIf([Unita]![CS]="C",[Unita]![Quan],0)) AS Cari, 
    Sum(IIf([Unita]![CS]="S",[Unita]![Quan],0)) AS Scar
    FROM 
    tbProdotto 
    LEFT JOIN 
    (
    SELECT 
    "C" AS CS, 
    tbCarico.QUANTITA_CARICO AS Quan, 
    tbCarico.COD_PRODOTTO AS Cod
    FROM 
    tbCarico 
    UNION ALL 
    SELECT 
    "S" AS CS, 
    tbScarico.QUANTITA_SCARICO, 
    tbScarico.COD_PRODOTTO
    FROM 
    tbScarico
    )  AS Unita 
    ON 
    tbProdotto.COD_PRODOTTO = Unita.Cod
    GROUP BY 
    tbProdotto.COD_PRODOTTO, 
    tbProdotto.DESCRIZIONE
    ;

    Facci sapere

    .

  3. #3
    Ciao, grazie per la risposta.

    Non posso mettere carico e scarico assieme perchè devo monitorare le date di entrambe le attività e rischierei di avere ridondanze di record.

    Per adesso ho fatto così:

    ho creato 2 query scindendo la query di union, a questo punto ho creato una terza query che prende i dati creati dalle due query controllando la relazione dei record tramite il codice prodotto

    Il problema è che così mi perdo il "carico" se non è stato fatto alcun "scarico" perchè ovviamente non trova alcun record da relazione nella condizione where.

    Sto cercando di capire come fare tramite una union:

    SELECT CARICO.SumOfQUANTITA_CARICO AS TOT_CARICO, SCARICO.SumOfQUANTITA_SCARICO AS TOT_SCARICO, (TOT_CARICO - TOT_SCARICO) as RESIDUO,CARICO.DESCRIZIONE AS Expr3, SCARICO.DESCRIZIONE AS Expr4
    FROM CARICO, SCARICO
    WHERE (((CARICO.DESCRIZIONE)=[SCARICO].[DESCRIZIONE]));

    UNION

    ?

  4. #4
    Scusa, ho letto meglio la tua prima ipotesi ed il risultato è esattamente quello che cercavo !

    Faccio ora degli altri test per validazione.

    Grazie

  5. #5
    Ho apportato qualche piccola differenza per calcolare subito la differenza, anche quando lo "scarico" non c'è ritornando NULL dalla query

    codice:
    SELECT
     tbProdotto.COD_PRODOTTO,
     tbProdotto.DESCRIZIONE,
     CC.SuCar AS CARICO,
     IIf(SS.SuSca Is Null,0,SS.SuSca) AS SCARICO,
     (CARICO-SCARICO) AS RESIDUO
    
     FROM
    (tbProdotto 
     LEFT JOIN 
       (SELECT tbCarico.COD_PRODOTTO, Sum(tbCarico.QUANTITA_CARICO) AS SuCar FROM tbCarico GROUP BY tbCarico.COD_PRODOTTO ) AS CC ON tbProdotto.COD_PRODOTTO = CC.COD_PRODOTTO) 
    
     LEFT JOIN 
       (SELECT tbScarico.COD_PRODOTTO, Sum(tbScarico.QUANTITA_SCARICO) AS SuSca FROM tbScarico GROUP BY tbScarico.COD_PRODOTTO ) AS SS ON tbProdotto.COD_PRODOTTO = SS.COD_PRODOTTO;

    Grazie ancora, buona giornata

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da dasvidania
    Non posso mettere carico e scarico assieme perchè devo monitorare le date di entrambe le attività e rischierei di avere ridondanze di record.
    Secondo me stai sbagliando.

    Quando progetti le tabelle devi pensare solamente al flusso del lavoro che devi gestire

    Poi su una base dati ben progettata diventa tutto piu facile
    anche monitorare le date

    .

  7. #7
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Originariamente inviato da dasvidania
    IIf(SS.SuSca Is Null,0,SS.SuSca) AS SCARICO,
    Per quel problema esiste la specifica funzione Nz ( Null To 0 )

    Nz(SS.SuSca,0) AS SCARICO,

    .

  8. #8
    Grazie ancora, non conoscevo quella funzione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.