首页 > 解决方案 > 为在某些分支机构工作的人寻找假期

问题描述

我有 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 所以:

在日期(2019/02/06)AllBranch 为 0 所以:

我需要 sql 查询,我正在使用 SQL Server 2016

标签: sqlsql-server

解决方案


一种解决方案是将其分为两部分:

首先选择 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

推荐阅读