sql - 连接表中的列计数但包含零(无法让 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
那么我错过了什么?
解决方案
将 Ord 条件从WHERE
to移动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
推荐阅读
- azure - 带有 MLOps 的 AutoML 导致我出现错误 - 消息:找不到提供的模型路径
- c# - IsCancellationRequested 始终为 false
- azure-eventhub - EventHubProducerClient 是否可以跨多个请求重用
- c# - 桌面程序的 C# 证书
- c - 将终端参数传递给另一个函数
- node.js - 如果我已经安装了 apache,如何运行节点服务器?
- linux - Ubuntu 18.04 上的 Yii2 SwiftMailer 无法连接到 CPanel SMTP 服务器
- c# - .NET WebSockets 和 TCP_NODELAY
- google-chrome-extension - Chrome 扩展:将授权标头值(令牌)保存到本地文件或将其传递给 background.js
- c# - 如何将 TabItem 的标题与标题的 TabItem DataTemplate 中的文本绑定?