选择第二个表中的数据在其他表连接中不存在的行[SQL]

时间:2015-08-31 10:20:01

标签: sql sql-server join stored-procedures

首先是包含日期的表格以及是否是假期。此表包含从开始时间到结束时间的所有日期:)

Table Calendar
-DMY date PK
-isHoliday bit

其次,出勤表保存了人们的出勤率。如果一个人是onleave,那么该标志设置为1.

Table Attendance
-Id int PK
-DMY date FK
-CheckIn time
-PersonId int
-onLeave bit

现在我想得到一个观点,告诉我在给定的时间间隔内缺席或休假的人。问题是,缺席的考勤表中没有条目。

区间20150822至20150829的样本结果

    DMY    |  personId  |  onLeave
-------------------------------------
  20150823 |     1      |    0
  20150823 |     2      |    1
  20150825 |     3      |    0
  20150826 |     2      |    0
  20150827 |     8      |    0
  20150827 |     5      |    0
  20150827 |     1      |    1
  20150829 |     3      |    1
  

目前:使用onLeave = 0

输入考勤表      

离开:在出勤表中输入onLeave = 1

     

缺席:当天没有参加Calendar.isHoliday = 0的参加

我希望创建一个程序,根据样本(缺席和离开)在 @startDate 提供的时间间隔内为我提供所有人的数据 @endDate 参数。

任何帮助,提示和线索都将深受赞赏。

注意:我无法修改表结构。

1 个答案:

答案 0 :(得分:1)

所有人的列表":

人与日历之间的交叉联接每人产生一天,如果没有出席该人缺席,则左连接会使出席人数减少

SELECT p.PersonID ,
       a.*,
       absent = CASE WHEN a.onLeave IS NULL OR onLeave = 1 THEN 1 ELSE 0 END
FROM Calendar c
CROSS JOIN Persons p 
LEFT JOIN Attendance a ON c.DMY = a.DMY AND a.PersonId = p.PersonId
WHERE C.DMY > @startDate AND C.DMY < endDate AND c.isHoliday <> 1