sql - 为在某些分支机构工作的人寻找假期
问题描述
我有 3 个数据表:有些人在一个分支工作,有些人在 2 个或更多分支工作。
我们定义了 2 个案例假期:类型 1 所有分支都已关闭,类型 0 是某些分支已关闭(不是全部)。
现在我想找人,如果所有的人分支都关门了
假期
ID Date AllBranch
1 2019/02/01 1
2 2019/02/05 0
3 2019/02/06 0
分行假日
ID HolidayID BranchID
1 2 2
2 2 3
3 3 2
人科
ID PersonID BranchID
1 10 2
2 11 2
3 11 3
4 12 2
5 12 4
我想要的结果是:
PersonID Hdate
10 2019/02/01
11 2019/02/01
12 2019/02/01
10 2019/02/05
11 2019/02/05
10 2019/02/06
在日期(2019/02/01)AllBranch 为 1,所以所有人都在度假
在日期(2019/02/05)AllBranch 为 0 所以:
- 仅在 BranchId 2 中工作的 PersonID-10 在 BranchHoliday 表中定义,因此在假期中
- PersonID-11 在 2 个分支 (2,3) 中工作,所有 2,3 都在 BranchHoliday 表中定义为关闭,因此在假期中
- PersonID-12 在 2 个分支(2,4)中工作,BranchId 4 未定义在 BranchHoliday 中关闭,因此不在假期中
在日期(2019/02/06)AllBranch 为 0 所以:
- PersonID-10 仅在 BranchId 2 中工作,分支 2 在 BranchHoliday 表中定义,因此在假期中
- PersonID-11 在 2 个分支 (2,3) 中工作,只有分支 3 未在 BranchHoliday 表中定义为关闭,因此不在假期中
- PersonID-12 在 2 个分支 (2,4) 工作,分支 3 未定义在 BranchHoliday 表中关闭,因此不在假期
我需要 sql 查询,我正在使用 SQL Server 2016
解决方案
一种解决方案是将其分为两部分:
首先选择 AllBranch 假期的人员,然后再选择特定假期的人员,他们工作的所有分支机构都有定义的假期:
SELECT AllPers.PersonID, H.Date
FROM Holiday H
INNER JOIN (
SELECT DISTINCT PersonID
FROM PersonBranch
) AllPers ON H.AllBranch = 1
UNION
SELECT Sub.PersonID, H.Date
FROM Holiday H
INNER JOIN (
SELECT PB.PersonID
, SUM(IIF(BH.BranchID IS NULL, 1, 0)) AS AnyBranchOpen
FROM PersonBranch PB
LEFT JOIN BranchHoliday BH ON PB.BranchID = BH.BranchID
GROUP BY PB.PersonID
) Sub ON AnyBranchOpen = 0
WHERE H.AllBranch = 0
推荐阅读
- angular - 在 Angular(v2 及更高版本)反应形式表单数组中获取无效控件
- python - ValueError:“图像”必须具有 3 或 4 个维度
- graphql - Nextjs - 内容丰富 - 标签 - 动态页面
- nuxt.js - Nuxt fetch 钩子:为什么在服务器和客户端都触发?
- python - 我在 Linux/Ubuntu 系统上的 Virtualenv 中使用 Python3,pyaudio 已安装,但无法在 Jupyter Notebook 中导入
- php - Xdebug 在 Composer 插件中不可用
- c# - 无法让 MySQL Connector/NET 在 Ubuntu 上工作
- c# - CefSharp Winform MDI
- java - rust 和 JNI crate - 将 java 对象转换为字节数组并返回它们并返回空字段
- c++ - 我可以在容器中插入各种类型的元素吗?