Search code examples
t-sqlstimulsoft

SELECT Value even if NULL on LEFT JOIN


I am trying to pull data out and chuck it into a Stimulsoft report. The problem I am having is that I need it to output to two columns. I also need every "manager" record to show even if the count assigned to said record is NULL.

This is what i have at the moment:

DECLARE @ManagerCount INT = (( SELECT Count(*) FROM AM WHERE dbo.AM.AMCurrent = 1 AND dbo.AM.OmitInReport = 0 ) + 1) / 2

DECLARE @tmp_AM1 TABLE (AMID INT, AMName NVARCHAR(100), ID INT)
INSERT INTO @tmp_AM1 SELECT AMID, AMName, row_number() over (order by AMID ) FROM AM
WHERE dbo.AM.AMCurrent = 1 AND dbo.AM.OmitInReport = 0  

SELECT * FROM (
    SELECT ta.id AS id1, ta.AMName AS ManagerName1, COUNT(*) AS ManagerCount1 FROM @tmp_AM1 tA  INNER JOIN Job J ON tA.AMID = j.AMID
    WHERE ta.ID BETWEEN 1 AND @ManagerCount AND j.jobStatusID != 5
    GROUP BY ta.ID, ta.AMName
) a
LEFT JOIN
(
    SELECT ta.id AS id2,ta.AMName AS ManagerName2, COUNT(*) AS ManagerCount2 FROM @tmp_AM1 tA  INNER JOIN Job J ON tA.AMID = j.AMID
    WHERE ta.ID > @ManagerCount AND j.jobStatusID != 5
    GROUP BY ta.AMName, ta.ID
) b ON a.id1 + @ManagerCount = b.id2

Which ends up returning something like:

enter image description here

There are 18 managers so 9 per column, but this code doesn't show them all since anything that doesn't have a count in the first left join, won't show, and therefore the same row in column 2 doesn't show.

Results of SELECT * FROM @tmp_AM1:

enter image description here


Solution

  • Probably not the best approach but i got the correct output using:

    DECLARE @ManagerCount INT = (( SELECT Count(*) FROM AM WHERE dbo.AM.AMCurrent = 1 AND dbo.AM.OmitInReport = 0 ) + 1) / 2
    
    DECLARE @tmp_AM1 TABLE (AMID INT, AMName NVARCHAR(100), ID INT)
    INSERT INTO @tmp_AM1 SELECT AMID, AMName, row_number() over (order by AMID ) FROM AM
    WHERE dbo.AM.AMCurrent = 1 AND dbo.AM.OmitInReport = 0 
    ORDER By AMName 
    
    SELECT ManagerName1, ManagerName2, ManagerCount1, ManagerCount2 FROM (
    SELECT AMID, ta.id AS id1, ta.AMName AS ManagerName1 FROM @tmp_AM1 tA 
        WHERE (ta.ID BETWEEN 1 AND @ManagerCount)
    ) a
    LEFT JOIN
    (
        SELECT AMID, ISNULL(COUNT(*), 0) AS ManagerCount1 FROM Job j
        INNER JOIN tblJobOutcome jO ON j.JobOutcomeID = jo.JobOutcomeID AND jO.JobOutcomeID != 5
        GROUP BY AMID
    ) a1 ON a.AMID = a1.AMID
    LEFT JOIN
    (
        SELECT AMID, ta.id AS id2, ta.AMName AS ManagerName2 FROM @tmp_AM1 tA 
        WHERE (ta.ID > @ManagerCount)
    ) b ON a.id1 + @ManagerCount = b.id2
    LEFT JOIN
    (
        SELECT AMID, ISNULL(COUNT(*), 0) AS ManagerCount2 FROM Job j 
        INNER JOIN tblJobOutcome jO ON j.JobOutcomeID = jo.JobOutcomeID AND jO.JobOutcomeID != 5
        GROUP BY AMID
    ) b1 ON b.AMID = b1.AMID
    

    Gives me the correct output in two columns.

    gives me this:

    enter image description here