> INSERT INTO [dbo].[Incassi] ([Rata], [CampoData], [Saldo], [id], [idanagrafica])
> VALUES ( 401.00, '2007-11-19 00:00:00.000', 0, 'B47118D3-17B2-4315-A05C-314F270280A8', 'B30D1B68-0787-404A-B8A9-561F3EEA3B82' );
...
> INSERT INTO [dbo].[Incassi] ([Rata], [CampoData], [Saldo], [id], [idanagrafica])
> VALUES ( 500.00, '2007-11-19 00:00:00.000', 0, 'AA3317E7-A485-4389-9B6A-8288A6734842', 'B30D1B68-0787-404A-B8A9-561F3EEA3B82' );
...
> INSERT INTO [dbo].[Incassi] ([Rata], [CampoData], [Saldo], [id], [idanagrafica])
> VALUES ( 10.00, '2007-11-20 00:00:00.000', 0, 'DD7C873C-88BB-46D3-B051-BAAAB3FA199B', 'B30D1B68-0787-404A-B8A9-561F3EEA3B82' );
...
> INSERT INTO [dbo].[Acquisti] ([CampoData], [Prezzo], [Quantita], [Saldo], [id], [idanagrafica], [idarticolo])
> VALUES ( '2007-11-19 00:00:00.000', 1300.00, 1, 0, '5300A866-C5D6-4D0E-9FD9-2AD0FD8ECBEF', 'B30D1B68-0787-404A-B8A9-561F3EEA3B82', 'EE4E72F0-1AF4-422F-B6B1-10E08DFCA22B' );
...
> INSERT INTO [dbo].[Anagrafica] ([Cognome], [Nome], [Indirizzo], [Rata], [Tipologia], [CampoNote], [vecchia], [id])
> VALUES ( 'Cagliari', 'a', 'a', 50.00, 's', 'a', 0, 'B30D1B68-0787-404A-B8A9-561F3EEA3B82' );
Questi sono i dati relativi a Cagliari.
Il saldo sia degli incassi che degli acquisti è 0, quindi devo considerare tutte le righe.
Dato che abbiamo 3 incassi per ogni acquisto la JOIN andrà a moltiplicare per 3 il prezzo di acquisto: 1300,00 * 3 = 3900,00
Ora somma la rata degli incassi: 401,00 + 500,00 + 10,00 = 911,00
Fai la differenza: 3900,00 - 911,00 = 2989,00 che non soddisfa la clausola HAVING della query.
Se vuoi considerare solo 1 acquisto indipendentemente dal numero di incassi puoi aggiungere la clausola DISTINCT alla funzione di aggregazione SUM():
SELECT
A.id
, A.Cognome
, A.Nome
, SUM(DISTINCT ACQ.Prezzo) AS Prezzo
, SUM(I.Rata) AS Rata
, SUM(DISTINCT ACQ.Prezzo) - SUM(I.Rata) AS Differenza
FROM Anagrafica AS A
INNER JOIN Acquisti AS ACQ
ON A.id = ACQ.idanagrafica
LEFT JOIN Incassi AS I ON A.id = I.idanagrafica
WHERE ACQ.Saldo = 0
AND COALESCE(I.Saldo, 0) = 0
GROUP BY A.id, A.Cognome, A.Nome
HAVING (SUM(DISTINCT ACQ.Prezzo) - COALESCE(SUM(I.Rata), 0) < 400);
/* Output:
id Cognome Nome Prezzo Rata Differenza
------------------------------------ ---------- ----- -------- -------- -----------
0A2ACEE7-4B13-4A6E-B0C7-04D473E398D2 Palermo a 325,00 10,00 315,00
C0EA6534-8777-4E09-BFBA-32663322674F Trento a 325,00 NULL NULL
74400AD4-834A-41D1-B62A-4AFD94F82B97 Firenze a 325,00 80,00 245,00
B30D1B68-0787-404A-B8A9-561F3EEA3B82 Cagliari a 1300,00 911,00 389,00
1B83B9BD-A3A9-4381-AF2A-AC9A32A94084 Milano a 325,00 120,00 205,00
6EDD8BDC-B2C6-45EB-B9E2-B6A44C6195D3 Roma a 325,00 10,00 315,00
Warning: Null value is eliminated by an aggregate or other SET operation.
(6 row(s) affected)
*/
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org