Sql 获取每个员工缺勤记录的值

Sql 获取每个员工缺勤记录的值,sql,postgresql,Sql,Postgresql,我有两张桌子: 表1-员工承诺 此表描述了员工投入时间的百分比 栏目: 日期:他们投入时间的日期 员工:员工用户名 承诺:例如,20%表示员工计划将每天20%的时间用于工作 表2-日历 这个表基本上是一个日历,一年中的每一天都有一行 栏目: 日历日期 包括:一个二进制列,指示该日期是否为工作日(例如,如果该日期为周末或假日,则该值为0,否则为1) EmployeeCommitment表格不包含员工没有承诺的天数,这是非常合理的,因为只有当有人承诺工作时,才会出现新的一行,而不是相反的一行

我有两张桌子:

表1-员工承诺 此表描述了员工投入时间的百分比

栏目:

  • 日期:他们投入时间的日期
  • 员工:员工用户名
  • 承诺:例如,20%表示员工计划将每天20%的时间用于工作
表2-日历 这个表基本上是一个日历,一年中的每一天都有一行

栏目:

  • 日历日期
  • 包括:一个二进制列,指示该日期是否为工作日(例如,如果该日期为周末或假日,则该值为0,否则为1)
EmployeeCommitment表格不包含员工没有承诺的天数,这是非常合理的,因为只有当有人承诺工作时,才会出现新的一行,而不是相反的一行

但我想要的是,每天都有员工没有投入到任何工作中去。例如,如果员工
john.smith
本周只承诺了3天(
mon
tue
wed
),他应该为
thu
fri
(假设这是一个没有假期的正常周)额外获得两行,其中包含他的姓名和0%的承诺,这周总共有5行

我试着这样把两张桌子连接起来

SELECT * FROM  Calendar c LEFT JOIN EmployeeCommitment e ON c.Calendar_Date=EmployeeCommitment.Date

但是此联接为右侧的表提供了
null
列,无法知道它们属于哪个员工。

您需要使用
交叉联接生成所有行,然后输入所需信息。例如,使用左联接

SELECT c.*, e.employee, COALESCE(ec.commitment, 0) as commitment
FROM Calendar c CROSS JOIN
     (SELECT DISTINCT Employee FROM Employees e) e LEFT JOIN
     EmployeeCommitment ec
     ON c.Calendar_Date = ec.Date AND
        e.Employee = ec.Employee;