LEFT JOIN doubt

EL-g

Registered User.
Local time
Today, 15:44
Joined
Jul 14, 2006
Messages
68
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
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?
 

Users who are viewing this thread

Back
Top Bottom