I'm currently running a SQL statement with a few subqueris. Basically i divided my SQL in 2 major groups: G3 and G4. When i run them seperatly they work fine as follows: THIS IS G3
And THIS IS G4
When i run them seperatly i get the queried results i want. The thing is that G3.Name has more observations(names) than G4.name. So the idea is to left join them as follows
Then when i do that every G4 (name, prodname,.....) is returned as NULL. It only works when i join G3 and G4 with INNER JOIN (which will exclute the null G3.name) and i cannot understand why.
Does anyone have a clue on what might be happening here?
Code:
SELECT G3.Name, G3.Average AS AUM, G3.Currency, G3.VAT, G3.mngmt_fee, G3.retrocession
FROM (SELECT cd_clients.name, AVG(client_data.val) AS Average, cd_clients.Currency, cd_clients.VAT, cd_clients.mngmt_fee, cd_clients.Retrocession
FROM cd_clients INNER JOIN client_data ON cd_clients.id = client_data.cd_clientID where client_data.valDate Between #10/01/2006# And #12/31/2006#
GROUP BY cd_clients.name,cd_clients.Currency,cd_clients.VAT,cd_clients.mngmt_fee, cd_clients.Retrocession) AS G3
And THIS IS G4
Code:
SELECT G4.name, G4.Multiplication AS IHP, G4.ProdName
FROM (SELECT G2.Name, G1.ProdName, AVG(G1.MonthlyAvg*[G2.Position]) AS Multiplication
FROM(SELECT cd_prod.name AS ProdName, AVG(prod_data.val) AS MonthlyAVG, MONTH(prod_data.valdate) AS MonthPart
FROM cd_prod INNER JOIN prod_data ON cd_prod.id = prod_data.cd_prodID
WHERE YEAR(prod_data.valdate) = '2006' AND MONTH(prod_data.valdate) BETWEEN 10 AND 12
GROUP BY MONTH(prod_data.valdate), cd_prod.name) AS G1
LEFT JOIN (SELECT cd_clients.Name, pos_data.product as ProdName, SUM(pos_data.Shares) AS [POSITION], MONTH(#10/31/2006#) AS MonthPart
FROM pos_data RIGHT JOIN cd_clients on pos_data.reference = cd_clients.Name
WHERE pos_data.period BETWEEN #12/31/2001# AND #10/31/2006#
GROUP BY pos_data.reference, pos_data.product, cd_clients.Name
UNION ALL
SELECT cd_clients.Name, pos_data.product AS ProdName, SUM(pos_data.Shares) AS [POSITION], MONTH(#11/30/2006#) AS MonthPart
FROM pos_data RIGHT JOIN cd_clients on pos_data.reference = cd_clients.Name
WHERE pos_data.period BETWEEN #12/31/2001# AND #11/30/2006#
GROUP BY pos_data.reference, pos_data.product, cd_clients.Name
UNION ALL
SELECT cd_clients.Name, pos_data.product AS ProdName, SUM(pos_data.Shares) AS [POSITION], MONTH(#12/31/2006#) AS MonthPart
FROM pos_data RIGHT JOIN cd_clients on pos_data.reference = cd_clients.Name
WHERE pos_data.period BETWEEN #12/31/2001# And #12/31/2006#
GROUP BY pos_data.reference, pos_data.product, cd_clients.Name) AS G2 on G2.ProdName = G1.ProdName AND G2.MonthPart = G1.MonthPart
GROUP BY G1.ProdName, G2.Name) AS G4
When i run them seperatly i get the queried results i want. The thing is that G3.Name has more observations(names) than G4.name. So the idea is to left join them as follows
Code:
SELECT G3.Name, G3.Average AS AUM, G4.Multiplication AS IHP,G3.Average-G4.Multiplication AS NET_AUM, G4.ProdName, G3.Currency, G3.VAT, G3.mngmt_fee, G3.retrocession
FROM (SELECT cd_clients.name, AVG(client_data.val) AS Average, cd_clients.Currency, cd_clients.VAT, cd_clients.mngmt_fee, cd_clients.Retrocession
FROM cd_clients INNER JOIN client_data ON cd_clients.id = client_data.cd_clientID where client_data.valDate Between #10/01/2006# And #12/31/2006#
GROUP BY cd_clients.name,cd_clients.Currency,cd_clients.VAT,cd_clients.mngmt_fee, cd_clients.Retrocession) AS G3
LEFT JOIN (SELECT G2.Name, G1.ProdName, AVG(G1.MonthlyAvg*[G2.Position]) AS Multiplication
FROM(SELECT cd_prod.name AS ProdName, AVG(prod_data.val) AS MonthlyAVG, MONTH(prod_data.valdate) AS MonthPart
FROM cd_prod INNER JOIN prod_data ON cd_prod.id = prod_data.cd_prodID
WHERE YEAR(prod_data.valdate) = '2006' AND MONTH(prod_data.valdate) BETWEEN 10 AND 12
GROUP BY MONTH(prod_data.valdate), cd_prod.name) AS G1
LEFT JOIN (SELECT cd_clients.Name, pos_data.product as ProdName, SUM(pos_data.Shares) AS [POSITION], MONTH(#10/31/2006#) AS MonthPart
FROM pos_data RIGHT JOIN cd_clients on pos_data.reference = cd_clients.Name
WHERE pos_data.period BETWEEN #12/31/2001# AND #10/31/2006#
GROUP BY pos_data.reference, pos_data.product, cd_clients.Name
UNION ALL
SELECT cd_clients.Name, pos_data.product AS ProdName, SUM(pos_data.Shares) AS [POSITION], MONTH(#11/30/2006#) AS MonthPart
FROM pos_data RIGHT JOIN cd_clients on pos_data.reference = cd_clients.Name
WHERE pos_data.period BETWEEN #12/31/2001# AND #11/30/2006#
GROUP BY pos_data.reference, pos_data.product, cd_clients.Name
UNION ALL
SELECT cd_clients.Name, pos_data.product AS ProdName, SUM(pos_data.Shares) AS [POSITION], MONTH(#12/31/2006#) AS MonthPart
FROM pos_data RIGHT JOIN cd_clients on pos_data.reference = cd_clients.Name
WHERE pos_data.period BETWEEN #12/31/2001# And #12/31/2006#
GROUP BY pos_data.reference, pos_data.product, cd_clients.Name) AS G2 on G2.ProdName = G1.ProdName AND G2.MonthPart = G1.MonthPart
GROUP BY G1.ProdName, G2.Name) AS G4 on G3.Name = G4.Name
Then when i do that every G4 (name, prodname,.....) is returned as NULL. It only works when i join G3 and G4 with INNER JOIN (which will exclute the null G3.name) and i cannot understand why.
Does anyone have a clue on what might be happening here?