Sum per query in access non corretto

venerdì 22 dicembre 2006 - 13.34

zseven Profilo | Senior Member

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:

[CODE]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));[/CODE]

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 :ciauz:

lbenaglia Profilo | Guru

>In pratica mi ha raddoppiato il valore importo_ordine là dove
>esistono piu fatture per quell'ordine.

Ciao zseven,

eh, per forza, se esistono fatture multiple per lo stesso ordine, le righe dell'ordine saranno moltiplicate nel momento in cui metterai in JOIN le due tabelle per OrdineID.
Ti ho preparato un piccolo esempio per SQL Server (tanto per avere 4 dati su cui ragionare ) che ti propone 3 soluzioni.
Se non ricordo male, la prima non funziona con Access, ma con le altre due non dovresti avere problemi di sorta:

USE tempdb; CREATE TABLE dbo.Ordini( OrdineID int NOT NULL IDENTITY PRIMARY KEY, ProgettoID int NOT NULL, Importo smallmoney NOT NULL ); CREATE TABLE dbo.Fatture( FatturaID int NOT NULL IDENTITY PRIMARY KEY, OrdineID int NOT NULL, CONSTRAINT FK_Fatture_Ordini FOREIGN KEY(OrdineID) REFERENCES dbo.Ordini(OrdineID) ); INSERT dbo.Ordini VALUES(7, 300.00); INSERT dbo.Ordini VALUES(7, 100.00); INSERT dbo.Fatture VALUES(1); INSERT dbo.Fatture VALUES(1); INSERT dbo.Fatture VALUES(2); /* Tua query */ SELECT SUM(O.Importo) AS SumOfimporto_ordine FROM dbo.Ordini AS O INNER JOIN dbo.Fatture AS F ON O.OrdineID = F.OrdineID WHERE O.ProgettoID = 7; /* Output: SumOfimporto_ordine --------------------- 700,00 (1 row(s) affected) */ /* Soluzione 1 */ SELECT SUM(DISTINCT O.Importo) AS SumOfimporto_ordine FROM dbo.Ordini AS O INNER JOIN dbo.Fatture AS F ON O.OrdineID = F.OrdineID WHERE O.ProgettoID = 7; /* Soluzione 2 */ SELECT SUM(O.Importo) AS SumOfimporto_ordine FROM dbo.Ordini AS O INNER JOIN ( SELECT OrdineID FROM dbo.Fatture GROUP BY OrdineID ) AS F ON O.OrdineID = F.OrdineID WHERE O.ProgettoID = 7; /* Soluzione 3 */ SELECT SUM(O.Importo) AS SumOfimporto_ordine FROM dbo.Ordini AS O INNER JOIN ( SELECT DISTINCT OrdineID FROM dbo.Fatture ) AS F ON O.OrdineID = F.OrdineID WHERE O.ProgettoID = 7; /* Output: SumOfimporto_ordine --------------------- 400,00 (1 row(s) affected) */ DROP TABLE dbo.Fatture, dbo.Ordini;

>Grazie :ciauz:
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

zseven Profilo | Senior Member

Ciao Lorenzo,
grazie per la risposta, sei gentilissimo come sempre.
Purtroppo non sono ancora ingrado di aggiustare la query complessa che ti dicevo essere il problema principale.
Il tuo aiuto l'ho riscritto così, in maniera tale che mi fosse piu comprensibile:
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;
Adesso però non riesco a trovare il modo di implementare questo aiuto all'interno della query completa, che è la seguente:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Questa query così come è, mi mostra l'errore che ti dicevo all'inizio, e quindi mi raddoppia il risultato.
Potresti dirmi come aggiustarla in base all'aiuto che mi hai dato?

Grazie mille

zseven Profilo | Senior Member

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:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5