SELECT 即使 LEFT JOIN 上的值为 NULL

SELECT Value even if NULL on LEFT JOIN

我正在尝试提取数据并将其放入 Stimulsoft 报告中。我遇到的问题是我需要它输出到两列。我还需要显示每个 "manager" 记录,即使分配给所述记录的计数为 NULL。

这是我目前拥有的:

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

最终返回如下内容:

有 18 位经理,所以每列 9 位,但此代码并未显示所有经理,因为在第一个左连接中没有计数的任何内容都不会显示,因此列中的同一行2 没有显示。

SELECT * FROM @tmp_AM1 的结果:

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 OUTER 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 where ManagerName2 IS Null and ManagerCount2  IS NULL

只是您想对 select 行使用 LEFT OUTER JOIN,即使有任何空值。,

由于这两个子查询几乎完全相同,除了 where 语句,我会考虑将其重写为一个查询。我不确定为什么您需要将相同的列输出到结果中的不同列中,但这样的事情可能会起作用:

WITH cte AS (
    SELECT 
        ta.id AS id
        ,ta.AMName AS ManagerName
        ,COUNT(*) AS ManagerCount
        ,CASE WHEN ta.ID BETWEEN 1 AND @ManagerCount THEN 0 ELSE 1 END AS something
    FROM 
        @tmp_AM1 tA  
        INNER JOIN Job J ON tA.AMID = j.AMID
    WHERE
        j.jobStatusID != 5
    GROUP BY
        ta.ID
        ,ta.AMName
        ,CASE WHEN ta.ID BETWEEN 1 AND @ManagerCount THEN 0 ELSE 1 END
)
SELECT
    CASE WHEN something = 0 THEN cte.id ELSE null END AS id1
    ,CASE WHEN something = 0 THEN cte.ManagerName ELSE null END AS ManagerName1
    ,CASE WHEN something = 0 THEN cte.ManagerCount ELSE null END AS ManagerCount1
    ,CASE WHEN something = 1 THEN cte.id ELSE null END AS id2
    ,CASE WHEN something = 1 THEN cte.ManagerName ELSE null END AS ManagerName2
    ,CASE WHEN something = 1 THEN cte.ManagerCount ELSE null END AS ManagerCount2
FROM
    cte

可能不是最好的方法,但我得到了正确的输出:

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

在两列中给我正确的输出。

给我这个: