首页 > 解决方案 > 连接表中的列计数但包含零(无法让 LEFT JOIN 工作)

问题描述

我必须要桌子。一个带有用户(称为Actor),一个带有订单(称为Ord)。

每个订单都可以分配给一个用户,但并非所有订单都分配了用户。

我想做一个选择语句,返回我的所有用户并显示每个用户分配了多少订单。包括那些没有分配订单的用户。

很简单,但由于某种原因,我无法让它工作。

这是我到目前为止所得到的:

SELECT Usr, COUNT(Ord.OrdNo)
FROM Actor
    LEFT JOIN Ord on Actor.EmpNo = Ord.Rsp
WHERE Actor.Gr2 <> 9
    AND Actor.R1 = 10
    AND Ord.OrdTp = 6
    AND Ord.OrdPrSt2 != 0x10
GROUP BY Actor.Usr

这只会返回分配了订单的用户,但我希望所有用户都返回,如果他们没有分配订单,则返回零。

请忽略这些WHERE条款(我没有在下面的示例数据中包含列/值)。尽管如此,在对我的实时数据运行查询时,我仍然应该返回大约 10 个用户。

样本数据

表:演员

Usr      EmpNo
----------------
ben      123
jane     124
jack     125
tom      126

表:订单

OrdNo    Rsp
----------------
555551   123
555552   123
555553   124
555554   126

这就是我想要返回的:

Usr      Count
----------------
123      2
124      1
125      0
126      1

但相反,我得到了这个:

Usr      Count
----------------
123      2
124      1
126      1

那么我错过了什么?

标签: sqlsql-serverjoinselectleft-join

解决方案


将 Ord 条件从WHEREto移动ON以获得真实LEFT JOIN结果:

SELECT Usr, COUNT(Ord.OrdNo)
FROM Actor
    LEFT JOIN Ord on Actor.EmpNo = Ord.Rsp
        AND Ord.OrdTp = 6
        AND Ord.OrdPrSt2 != 0x10
WHERE Actor.Gr2 <> 9
    AND Actor.R1 = 10
GROUP BY Actor.Usr

推荐阅读