Sql server SQL-如何返回没有倍数的结果

Sql server SQL-如何返回没有倍数的结果,sql-server,business-objects,Sql Server,Business Objects,我正在尝试编写一个业务对象报告,以显示在选定日期未返回时间表的人员列表,但我不知道如何停止为个人返回多个条目的SQL查询 My Staff_表包含两列-员工编号和姓名 我的时间表表包含员工编号和结束日期等内容 我可以轻松地编写一条语句,返回所有输入了一周结束日期为(例如,2012年8月10日)的时间表的用户。但是,如果我试图返回所有未填写2012年8月10日时间表的人的列表,我会选择表中没有该日期的每个时间表,因此,例如,如果一个人提交了100份时间表,其中只有一份是2012年8月10日的时间表

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

My Staff_表包含两列-员工编号和姓名 我的时间表表包含员工编号和结束日期等内容

我可以轻松地编写一条语句,返回所有输入了一周结束日期为(例如,2012年8月10日)的时间表的用户。但是,如果我试图返回所有未填写2012年8月10日时间表的人的列表,我会选择表中没有该日期的每个时间表,因此,例如,如果一个人提交了100份时间表,其中只有一份是2012年8月10日的时间表,那么结果将显示他99次。 我需要的是Staff_表上所有未在该日期提交的人员的固定列表,仅显示一次

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


有人能给我指出正确的方向吗?

尝试在查询中添加DISTINCT

您的查询应该类似于

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


尝试将DISTINCT添加到查询中

您的查询应该类似于

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


您可以使用
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'
        )

您可以使用
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'
        )

您是否可以选择所有未提交时间表的员工,并按其姓名对结果进行分组

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

我没有对此进行测试,但大致是这样的。

您能否选择所有未提交时间表的员工,并按其姓名对结果进行分组

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

我没有对此进行测试,但大致是这样的。

您应该首先选择所有未输入时间表的员工编号。然后,使用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)

您应该首先选择所有未输入时间表的员工编号。然后,使用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)

包括您的查询在这一点上会有所帮助,我使用了DISTINCT,但在这里它对我没有帮助。我知道,我必须在发布之前稍微稀释一下查询。它是由业务对象自动生成的,包含所有形式的连接等。我需要将其过滤到post,以使其与我的问题保持一致。包括您的查询在这一点上会有所帮助。我使用了DISTINCT,但在这里它对我没有帮助。我知道,我必须在发布前稍微稀释查询。它是由业务对象自动生成的,包含各种形式的连接等。我需要将其筛选到post,以使其与我的问题保持一致。应该提到的是,我尝试过了,但它不会改变我的结果。感谢Podiluska和所有人。在这里使用NOT IN命令成功了。另一个教训。谢谢。在kingkong0924之后,Podiluska发布了
而不是
,kingkong0924应该得到我应该提到的荣誉,我试过了,但它并没有改变我的结果。谢谢Podiluska和所有人。在这里使用NOT IN命令成功了。另一个教训。谢谢。在kingkong0924之后,Podiluska发布了
不在
中的帖子,谁应该得到这个荣誉?你不能在
having
子句中使用未聚合列你不能在
having
子句中使用未聚合列