sql - 如何将不符合 WHERE 条件的联接表中的数据包含为空值(SQL)
问题描述
我有 2 个表employees 和 Medical leave,通过员工 ID 关联,基本上 Medical leave 表会有多个休假的单个员工的多个数据,我想按病假月份过滤掉数据, 并将在过滤月份未发生病假的员工包括为空值。
EMPLOYEES MEDICAL
|employee|ID| |ID|DateOfLeave|
A 1 1 2019/1/3
B 2 1 2019/4/15
C 3 2 2019/5/16
D 4
我想出的 sql 语句过滤了休假的特定月份,并计算了他们在该月休假的次数,例如 1 月,它还包括没有任何休假的员工为“0”,但是员工有没有在一月份发生的病假根本没有出现在结果集中,我怎样才能显示他们在一月份有 0 个病假?
select employees.employee, employees.ID,
count(medical.DateOfLeave) as NumberOfLeaves
from employees
left outer join medical on employees.ID = medical.ID
where (MONTH(DateOfLeave) = 1) or (medical.DateOfLeave is null)
group by employees.employee,employees.ID
RESULT SET
|Employee|ID|NumberOfLeaves|
A 1 1
C 3 0
D 4 0
如您所见,B 消失了,但我希望它在结果集中显示为“0”,如员工 C 和 D
我知道这是因为员工 B 的医疗数据不符合 where 子句的条件,但是我如何编写一个语句,其中包括在结果集中没有出现在 1 月的病假为 0 的员工?
解决方案
您的查询仅显示在一月份休假或根本没有休假的员工的结果。
相反,如果有指定月份的记录,您只想加入医疗表中的记录,然后您将对结果进行分组并从那里获取计数。
为此,您需要更改加入条件以包含月份过滤器。
这是一个使用表变量的工作示例
DECLARE @Employees TABLE (ID INT, Employee CHAR(1))
DECLARE @Medical TABLE (ID INT, DateOfLeave DATE)
INSERT INTO @Employees
VALUES (1, 'A'), (2,'B'), (3,'C'), (4, 'D')
INSERT INTO @Medical
VALUES (1, '2019-01-03'), (1, '2019-04-15'), (2, '2019-05-16')
SELECT e.employee,
e.ID,
count(m.DateOfLeave) AS NumberOfLeaves
FROM @Employees e
LEFT OUTER JOIN @Medical m ON e.ID = m.ID AND MONTH(DateOfLeave) = 1
GROUP BY e.employee,e.ID
推荐阅读
- php - 如何解决“未调度预期的 [App\Events\UserRegistered] 事件。” 错误?
- scala - 有没有办法用每行的自定义连接来连接两个 Spark 数据帧
- python - 如何展开螺旋图?
- scala - 如何在 MacOS 上的 intellij IDEA 中更改运行时 JAVA 堆空间?
- javascript - 无法以 html 形式编写 AJAX 输出变量
- c - 从浮点数中分离数字
- php - 集合无法转换为 int Laravel
- django - 如何根据品牌对产品进行分组并在 django 中获取最低价格产品
- kubernetes - Kubernetes 上的 flink 将外部 jar 加载到集群
- regex - 分析器中的自定义字符过滤器不起作用