搜索本周缺失的记录

时间:2015-06-19 13:20:18

标签: sql ms-access-2007

我在编写SQL查询以搜索本周缺失的记录时遇到了麻烦。我正在使用access 2007.以下显示了我拥有的表格。

Employee Table        
ID     Name  
1      JOhn  
2      Peter  
Time Cards  
ID     Name     Date        Week        SO     CardNUm  
1      John     15/06/2015  21/06/2015  1234   1  
2      Peter    16/06/2015  21/06/2015  1233   2  
1      John     16/06/2015  21/06/2015  1231   3  
1      John     17/06/2015  21/06/2015  1230   4  

我设法使用以下sql查询搜索特定日期的缺失记录。

    SELECT DISTINCT  
      Employee.Name  
      Employee.ID  
    FROM Employee
    WHERE (((Employee.Name) Not In (
SELECT TC.Name 
FROM [Time Card] AS TC 
WHERE TC.Name = Employee.Name AND TC.Date = [Forms]![Missing Production Time Card]![Text12] )));

我正在尝试搜索所有记录,例如一周内的任何日子,例如2015年6月15日至2015年6月21日,对于没有输入时间卡的员工。 有什么方法可以修改我的查询或创建一个新查询,以便我得到以下结果?

上述时间卡表的结果应为

ID  Name Date  
1   John 18/06/2015  
1   John 19/06/2015  
1   John 20/06/2015  
1   john 21/06/2015  
2   Peter 15/06/2015  
2   Peter 17/06/2015  
2   Peter 18/06/2015  
2   Peter 19/06/2015  
2   Peter 20/06/2015  
2   Peter 21/06/2015  

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是创建临时表,并使用您要搜索的日期和员工填充该表。然后,您可以使用outer join加入Time Card表,并且临时表中Time Card中没有匹配行的任何行都将丢失。

让另一个表格显示特定周的日期列表会很有用 - 这会使下面的代码更容易一些,并且还允许您处理银行假日和周末。

这是对代码的抨击:

CREATE TABLE ##missing (
    Date datetime,
    ID int
)

INSERT ##missing SELECT '20150605', ID FROM Employee
-- Repeat for other dates in the week, or use the table proposed above

SELECT
    m.Date,
    e.Name
FROM ##missing m
JOIN Employee e
    ON m.ID = e.ID
LEFT OUTER JOIN [Time Card] tc
    ON m.ID = tc.ID
    AND m.Date = tc.Date
WHERE tc.ID IS NULL