>Ti allego il db così ti è piu chiaro il tutto.
Prova a dare un'occhiata alla seguente query:
SELECT
Nome
, Descrizione
, MAX(Importo) AS SumImporto
, MAX(Anticipo) AS SumAnticipo
, MAX(Pagamento) AS SumPagamento
, MAX(PagamentoAnticipo) AS SumPagamentoAnticipo
FROM(
SELECT
C.nome_categoria AS Nome
, C.descrizione_categoria AS Descrizione
, SUM(F.importo_ft) AS Importo
, SUM(F.conto_anticipo) AS Anticipo
, 0 AS Pagamento
, 0 AS PagamentoAnticipo
FROM tab_categorie AS C
INNER JOIN tab_fatture AS F
ON C.ID_categorie = F.id_categoria
GROUP BY C.nome_categoria, C.descrizione_categoria
UNION ALL
SELECT
C.nome_categoria
, C.descrizione_categoria
, 0
, 0
, SUM(P.importo_pagamento)
, SUM(P.importo_pagamento_anticipo)
FROM (tab_categorie AS C
INNER JOIN tab_fatture AS F
ON C.ID_categorie = F.id_categoria)
LEFT JOIN tab_pagamenti AS P
ON F.ID_fatture = P.ID_fattura
GROUP BY C.nome_categoria, C.descrizione_categoria
) AS Q
GROUP BY Nome, Descrizione;
SQL Server permette di riscrivere la precedente query in modo più "compresso":
SELECT
C.nome_categoria AS Nome
, C.descrizione_categoria AS Descrizione
, SUM(DISTINCT F.importo_ft) AS SumImporto
, SUM(DISTINCT F.conto_anticipo) AS SumAnticipo
, SUM(P.importo_pagamento) AS SumPagamento
, SUM(P.importo_pagamento_anticipo) AS SumPagamentoAnticipo
FROM tab_categorie AS C
INNER JOIN tab_fatture AS F
ON C.ID_categorie = F.id_categoria
LEFT JOIN tab_pagamenti AS P
ON F.ID_fatture = P.ID_fattura
GROUP BY C.nome_categoria, C.descrizione_categoria;
La clausola DISTINCT permette di selezionare solo i valori distinti, quindi la somma risulterà corretta.
>Grazie mille!
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org