Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chriss Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Two LEFT JOINS multiply my values

Status
Not open for further replies.

JimmyFo

Programmer
Feb 14, 2005
102
US
If I run this code, I get the proper results:

Code:
    SELECT 
		SUM(CASE WHEN MS.strMilestoneStatus = 'GREEN' THEN 1 ELSE 0 END) [COUNT_GREEN],
        SUM(CASE WHEN MS.strMilestoneStatus = 'YELLOW' THEN 1 ELSE 0 END) [COUNT_YELLOW],
        SUM(CASE WHEN MS.strMilestoneStatus = 'RED' THEN 1 ELSE 0 END) [COUNT_RED]
	FROM tblProject AS P
		--JOIN for milestone statuses
		LEFT JOIN tblProjectMilestone as MS
			ON P.intProjectID = MS.int_fk_ProjectID
    WHERE
		(11 IS NULL OR P.intProjectID = 11)

Results: 3 4 1

If I run this one, I get the proper results:

Code:
    SELECT 
		SUM(CASE WHEN PB.strBudgetStatus = 'GREEN' THEN 1 ELSE 0 END) [COUNT_BUDGET_GREEN],
        SUM(CASE WHEN PB.strBudgetStatus = 'YELLOW' THEN 1 ELSE 0 END) [COUNT_BUDGET_YELLOW],
        SUM(CASE WHEN PB.strBudgetStatus = 'RED' THEN 1 ELSE 0 END) [COUNT_BUDGET_RED]
	FROM tblProject AS P
		--JOIN for budget statuses
		LEFT JOIN tblProjectBudget as PB
			ON P.intProjectID = PB.int_fk_ProjectID
    WHERE
		(11 IS NULL OR P.intProjectID = 11)

Results: 2 1 0

But if I combine them, I get weird results:

Code:
    SELECT 
		SUM(CASE WHEN MS.strMilestoneStatus = 'GREEN' THEN 1 ELSE 0 END) [COUNT_GREEN],
        SUM(CASE WHEN MS.strMilestoneStatus = 'YELLOW' THEN 1 ELSE 0 END) [COUNT_YELLOW],
        SUM(CASE WHEN MS.strMilestoneStatus = 'RED' THEN 1 ELSE 0 END) [COUNT_RED],
		SUM(CASE WHEN PB.strBudgetStatus = 'GREEN' THEN 1 ELSE 0 END) [COUNT_BUDGET_GREEN],
        SUM(CASE WHEN PB.strBudgetStatus = 'YELLOW' THEN 1 ELSE 0 END) [COUNT_BUDGET_YELLOW],
        SUM(CASE WHEN PB.strBudgetStatus = 'RED' THEN 1 ELSE 0 END) [COUNT_BUDGET_RED]
	FROM tblProject AS P
		--JOIN for milestone statuses
		LEFT JOIN tblProjectMilestone as MS
			ON P.intProjectID = MS.int_fk_ProjectID
		--JOIN for budget statuses
		LEFT JOIN tblProjectBudget as PB
			ON P.intProjectID = PB.int_fk_ProjectID
    WHERE
		(11 IS NULL OR P.intProjectID = 11)

Results: 9 12 3 16 8 0

It looks like the first three are multiplied by three, and the next three are multiplied by 8.

Any ideas?

Thanks,
James
 
That is the LEFT JOIN, It ombines ALL matching records with ALL records, so if you have a table like this:
Code:
Table1
  PK
------
  1

Table2
  FK   Something
-----------------
  1       'aaaaaa'
  1       'bbbbbb'
  1       'cccccc'

and if you have:
Code:
SELECT *
       from Table1
LEFT JOIN Table2 ON Table1.PK = Table2.FK

you will get a result like this:
Code:
PK      FK         Something
-----------------------------
1        1         'aaaaaa'
1        1         'bbbbbb'
1        1         'cccccc'

Borislav Borissov
VFP9 SP1, SQL Server 2000/2005.
MVP VFP
 
This is NOT tested at all:
Code:
If I run this code, I get the proper results:
SELECT COALESCE([COUNT_GREEN], 0)         AS [COUNT_GREEN],
       COALESCE([COUNT_YELLOW], 0)        AS [COUNT_YELLOW],
       COALESCE([COUNT_RED], 0)           AS [COUNT_RED],
       COALESCE([COUNT_BUDGET_GREEN], 0)  AS [COUNT_BUDGET_GREEN],
       COALESCE([COUNT_BUDGET_YELLOW], 0) AS [COUNT_BUDGET_YELLOW],
       COALESCE([COUNT_BUDGET_RED], 0)    AS [COUNT_BUDGET_RED]
FROM (SELECT CASE WHEN 11 IS NULL THEN 0 ELSE P.intProjectID END P.intProjectID,
             SUM(CASE WHEN MS.strMilestoneStatus = 'GREEN' THEN 1 ELSE 0 END) [COUNT_GREEN],
             SUM(CASE WHEN MS.strMilestoneStatus = 'YELLOW' THEN 1 ELSE 0 END) [COUNT_YELLOW],
             SUM(CASE WHEN MS.strMilestoneStatus = 'RED' THEN 1 ELSE 0 END) [COUNT_RED]
     FROM tblProject AS P
          LEFT JOIN tblProjectMilestone as MS  ON P.intProjectID = MS.int_fk_ProjectID
     GROUP BY CASE WHEN 11 IS NULL THEN 0 ELSE P.intProjectID END P.intProjectID
     WHERE (11 IS NULL OR P.intProjectID = 11)) Tbl1
FULL JOIN (SELECT CASE WHEN 11 IS NULL THEN 0 ELSE P.intProjectID END P.intProjectID,
                 SUM(CASE WHEN PB.strBudgetStatus = 'GREEN' THEN 1 ELSE 0 END) [COUNT_BUDGET_GREEN],
                 SUM(CASE WHEN PB.strBudgetStatus = 'YELLOW' THEN 1 ELSE 0 END) [COUNT_BUDGET_YELLOW],
                 SUM(CASE WHEN PB.strBudgetStatus = 'RED' THEN 1 ELSE 0 END) [COUNT_BUDGET_RED]
          FROM tblProject AS P
               LEFT JOIN tblProjectBudget as PB
                    ON P.intProjectID = PB.int_fk_ProjectID
         GROUP BY CASE WHEN 11 IS NULL THEN 0 ELSE P.intProjectID END P.intProjectID
         WHERE (11 IS NULL OR P.intProjectID = 11)) Tbl2
ON Tbl1.intProjectID  = Tbl2.intProjectID
and BTW how 11 could be NULL?

Borislav Borissov
VFP9 SP1, SQL Server 2000/2005.
MVP VFP
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top