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

    query sql con access: problema con SUM

    Ciao ragazzi,
    ho un problema, non vi posto tutta la query perchè è una cosa incredibile, cerco di scrivere la parte del problema.
    Io ho due tabelle
    tab_ordini
    tab_fatture

    Tab_Fatture presenta l'id della tabella ordini fra i suoi campi, con una relazione ordini-fatture di uno a molti.

    Io adesso ho la necessità di calcolare la somma degli ordini.
    Faccio questa query:

    codice:
    SELECT Sum(tab_ordini.importo_ordine) AS SumOfimporto_ordine
    FROM tab_ordini INNER JOIN tab_fatture ON tab_ordini.ID_ordini = tab_fatture.id_ordine
    WHERE (((tab_ordini.id_progetto)=7));
    ma il risultato che ottengo non è corretto.

    In pratica mi ha raddoppiato il valore importo_ordine là dove esistono piu fatture per quell'ordine.
    Es:
    ordine 1 - IMPORTO 300,00
    ordine 2 - IMPORTO 100,00

    Invece di mostrarmi untotale uguale a 400 mi mostra un totale uguale a 700, questo perchè le fatture collegate all'ordine 1 sono due, e quindi lui fa:
    300+300+100

    Sapete dirmi come posso risolvere?
    Magari se superiamo questo primo passo poi vi faccio vedere il mostro di query che devo andare a modificare.

    Grazie

  2. #2
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    NOn devi fare sum....

    codice:
     SELECT tab_ordini.importo_ordine AS SumOfimporto_ordine
    FROM tab_ordini INNER JOIN tab_fatture ON tab_ordini.ID_ordini = tab_fatture.id_ordine
    WHERE (((tab_ordini.id_progetto)=7));
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  3. #3
    forse mi sono spiegato male.
    Io ho bisogno di avere il totale.

    facenco come dici tu mi mostra tre valori singoli, e cmq errati perchè fa:
    300
    300
    100

    quando invece gli ordini sono solo due.
    Il risultato esatto deve essere un solo record con risultato 400.

    Grazie

  4. #4
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Vuoi il totale degli ordini già fatturati o il totale in generale?
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  5. #5
    Ciao,
    dunque la soluzione semplice l'ho trovata, per calcolare il totale degli ordini, ed è la seguente:

    codice:
    SELECT Sum(tab_ordini.importo_ordine) AS SumOfimporto_ordine
    FROM tab_ordini INNER JOIN (SELECT id_ordine FROM tab_fatture GROUP BY tab_fatture.id_ordine)  AS F ON tab_ordini.ID_ordini=F.id_ordine
    WHERE tab_ordini.id_progetto=7;
    come ti dicevo però, il problema sta nell'implementare questa soluzione nella query complessiva che è la seguente:
    codice:
    SELECT tutto.nome_categoria, tutto.descrizione_categoria, tutto.aliquota_iva, Max(tutto.SommaDiretta) AS importo_diretto, Max(tutto.SommaLeasing) AS importo_leasing, Max(tutto.SommaOrdine) AS somma_ordine, Max(tutto.SommaDiimporto_ft) AS somma_ft, Max(tutto.SommaDiconto_anticipo) AS somma_anticipo, Max(tutto.SommaDiimporto_pagamento) AS somma_pagamento, Max(tutto.SommaDiimporto_pagamento_anticipo) AS somma_pagamento_anticipo
    FROM (SELECT tab_categorie.ID_categorie,  tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, 0 AS SommaDiretta, 0 AS SommaLeasing,  0 AS SommaOrdine, 0 AS SommaDiimporto_ft, 0 AS SommaDiconto_anticipo, tab_fatture.elimina_fattura, Sum(tab_pagamenti.importo_pagamento) AS SommaDiimporto_pagamento, Sum(tab_pagamenti.importo_pagamento_anticipo) AS SommaDiimporto_pagamento_anticipo, tab_pagamenti.elimina_pagamento
    FROM (tab_categorie INNER JOIN tab_voci ON tab_categorie.ID_categorie = tab_voci.id_categoria) INNER JOIN (tab_ordini INNER JOIN (tab_fatture LEFT JOIN tab_pagamenti ON tab_fatture.ID_fatture = tab_pagamenti.id_fattura) ON tab_ordini.ID_ordini = tab_fatture.id_ordine) ON tab_voci.ID_voci = tab_ordini.id_voce
    WHERE tab_fatture.elimina_fattura = false AND tab_pagamenti.elimina_pagamento = false AND tab_fatture.id_progetto = 7
    GROUP BY tab_categorie.ID_categorie, tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, tab_fatture.elimina_fattura, tab_pagamenti.elimina_pagamento
    union 
    SELECT tab_categorie.ID_categorie, tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, Sum(tab_voci.importo_diretto) as SommaDiretta, Sum(tab_voci.importo_leasing) AS SommaLeasing, Sum(tab_ordini.importo_ordine) AS SommaOrdine, Sum(tab_fatture.importo_ft) AS SommaDiimporto_ft, Sum(tab_fatture.conto_anticipo) AS SommaDiconto_anticipo, tab_fatture.elimina_fattura, 0 AS SommaDiimporto_pagamento, 0 AS SommaDiimporto_pagamento_anticipo, 0 
    FROM (tab_categorie INNER JOIN tab_voci ON tab_categorie.ID_categorie = tab_voci.id_categoria) INNER JOIN (tab_ordini INNER JOIN tab_fatture ON tab_ordini.ID_ordini = tab_fatture.id_ordine) ON tab_voci.ID_voci = tab_ordini.id_voce
    WHERE tab_fatture.elimina_fattura = false AND tab_fatture.id_progetto = 7
    GROUP BY tab_categorie.ID_categorie, tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, tab_fatture.elimina_fattura)  AS tutto
    GROUP BY tutto.nome_categoria, tutto.descrizione_categoria, tutto.aliquota_iva;
    Come vedi è un macello!!!
    Attualmente questa query mi dà il risultato errato che ti dicevo all'inizio.

    Mi rendo conto che è difficilissimo, ma se riuscissi a darmi una mano saresti un grande.

    Ciao e grazie

  6. #6
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Il database cosa è, access?

    Per una query così complessa, se il database supporta le view, fatti una o più view in modo da eliminare le sottoquery, così la query finale ti risulta più leggibile (e anche più veloce)
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

  7. #7
    il database è access.
    non ho mai usato le view, non le conosco proprio.

    se ti invio il db credi di poter fare qualcosa?

    Grazie

  8. #8
    Forse ce l'ho fatta!!
    Ho messo in neretto le parti che ho aggiunto per farlo funzionare.
    così funziona, spero di non aver sbagliato niente:

    codice:
    SELECT tutto.nome_categoria, tutto.descrizione_categoria, tutto.aliquota_iva, Max(tutto.SommaDiretta) AS importo_diretto, Max(tutto.SommaLeasing) AS importo_leasing, Sum(tutto.SommaOrdine) AS somma_ordine , Max(tutto.SommaDiimporto_ft) AS somma_ft, Max(tutto.SommaDiconto_anticipo) AS somma_anticipo, Max(tutto.SommaDiimporto_pagamento) AS somma_pagamento, Max(tutto.SommaDiimporto_pagamento_anticipo) AS somma_pagamento_anticipo
    
    FROM (SELECT tab_categorie.ID_categorie,  tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, 0 AS SommaDiretta, 0 AS SommaLeasing,  0 AS SommaOrdine , 0 AS SommaDiimporto_ft, 0 AS SommaDiconto_anticipo, tab_fatture.elimina_fattura, Sum(tab_pagamenti.importo_pagamento) AS SommaDiimporto_pagamento, Sum(tab_pagamenti.importo_pagamento_anticipo) AS SommaDiimporto_pagamento_anticipo, tab_pagamenti.elimina_pagamento
    
    
    FROM (tab_categorie INNER JOIN tab_voci ON tab_categorie.ID_categorie = tab_voci.id_categoria) INNER JOIN (tab_ordini INNER JOIN (tab_fatture LEFT JOIN tab_pagamenti ON tab_fatture.ID_fatture = tab_pagamenti.id_fattura) ON tab_ordini.ID_ordini = tab_fatture.id_ordine) ON tab_voci.ID_voci = tab_ordini.id_voce
    
    
    WHERE tab_fatture.elimina_fattura = false AND tab_pagamenti.elimina_pagamento = false AND tab_fatture.id_progetto = 7
    GROUP BY tab_categorie.ID_categorie, tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, tab_fatture.elimina_fattura, tab_pagamenti.elimina_pagamento
    union 
    
    SELECT tab_categorie.ID_categorie, tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_fatture.id_progetto, tab_fatture.aliquota_iva, Sum(tab_voci.importo_diretto) as SommaDiretta, Sum(tab_voci.importo_leasing) AS SommaLeasing, tab_ordini.importo_ordine AS SommaOrdine , Sum(tab_fatture.importo_ft) AS SommaDiimporto_ft, Sum(tab_fatture.conto_anticipo) AS SommaDiconto_anticipo, tab_fatture.elimina_fattura, 0 AS SommaDiimporto_pagamento, 0 AS SommaDiimporto_pagamento_anticipo, 0 
    
    
    FROM (tab_categorie INNER JOIN tab_voci ON tab_categorie.ID_categorie = tab_voci.id_categoria) INNER JOIN (tab_ordini INNER JOIN tab_fatture ON tab_ordini.ID_ordini = tab_fatture.id_ordine) ON tab_voci.ID_voci = tab_ordini.id_voce
    
    
    WHERE tab_fatture.elimina_fattura = false AND tab_fatture.id_progetto = 7
    GROUP BY  tab_categorie.ID_categorie, tab_categorie.nome_categoria, tab_categorie.descrizione_categoria, tab_ordini.importo_ordine , tab_fatture.id_progetto, tab_fatture.aliquota_iva, tab_fatture.elimina_fattura)  AS tutto
    GROUP BY tutto.nome_categoria, tutto.descrizione_categoria, tutto.aliquota_iva;

  9. #9
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    Per fare una view basta che vai in query e ne crei una.

    Si comportano come vere e proprie tabelle, ma estraggono i dati da tabelle esistenti
    Scusate i puntini di sospensione...... La verità è che non ho argomenti....

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.