0

我正在尝试编写一个业务对象报告,以显示在选定日期未返回时间表的人员列表,但我不知道如何停止 SQL 查询为个人返回多个条目。

我的 Staff_Table 包含 2 列 - 员工编号和姓名 我的 Timesheet_Table 包含员工编号和 Week_Ending_Date 等。

我可以轻松地编写一个语句来返回所有输入了 Week_Ending_Date 为例如 10/08/2012 的时间表的用户。但是,如果我尝试返回所有没有填写 2012 年 8 月 10 日时间表的人的列表,我会在表格中选取没有该日期的每个时间表,例如,如果一个人有提交了 100 个时间表,其中只有 1 个是 10/08/2012,结果将显示他 99 次。我需要的是 Staff_Table 上尚未在该日期提交的每个人的固定列表,仅显示一次。

我尝试了一个不存在的联合,但要么我做错了,要么就是不合适。

谁能指出我正确的方向?

4

4 回答 4

2

您应该首先选择所有未输入时间表的员工编号。然后,使用 NOT IN 过滤列表。

DECLARE @Week_Ending_Date DATETIME = '2012-08-10'
DECLARE @Staff TABLE
(
    EmployeeNo INT NOT NULL,
    EmployeeName NVARCHAR(100) NOT NULL
)
DECLARE @TimeSheet TABLE
(
    EmployeeNo INT NOT NULL,
    Week_Ending_Date DATETIME
)

INSERT INTO @Staff (EmployeeNo, EmployeeName)
VALUES (1, 'Alan'), (2, 'Peter')

INSERT INTO @TimeSheet (EmployeeNo, Week_Ending_Date)
VALUES (1, '2012-08-10'), (1, '2012-08-17'), (2, '2012-08-03')

SELECT
    S.EmployeeName
FROM
    @Staff S
WHERE
    EmployeeNo NOT IN (SELECT EmployeeNo FROM @TimeSheet WHERE Week_Ending_Date = @Week_Ending_Date)
于 2012-08-17T09:57:18.913 回答
1

尝试将 DISTINCT 添加到您的查询中

IE

SELECT DISTINCT ...

您的查询应该类似于

SELECT * 
FROM Staff
WHERE NOT EXISTS 
(
    Select EmployeeNo 
    from Timesheet 
    where WeekEndingDate='2012-08-10'     
    and TimeSheet.EmployeeNo  = Staff.EmployeeNo 
)

或者

SELECT * 
FROM Staff
WHERE EmployeeNo NOT IN 
(
    Select EmployeeNo 
    from Timesheet 
    where WeekEndingDate='2012-08-10'
)
于 2012-08-17T09:49:49.630 回答
1

您可以使用not exists子句查找未提交特定时间表的员工:

select  *
from    Staff s
where   not exists
        (
        select  *
        from    Timesheet t
        where   t.EmployeeNo =  s.EmployeeNo
                and t.Week_Ending_Date = '2012-08-19'
        )
于 2012-08-17T09:53:55.933 回答
0

您不能只选择所有尚未提交时间表的员工并按他们的姓名对结果进行分组吗?

select Name
from Staff_Table
left join Timesheet_Table on Staff_Table.[Employee No] = Timesheet_Table.[Employee No] and  Timesheet_Table.Week_Ending_Date = '10 August 2012'
having Timesheet_Table.Week_Ending_Date is null
group by Name, Timesheet_Table.Week_Ending_Date

我还没有测试过这个,但是这些方面的东西。

于 2012-08-17T09:55:34.093 回答