Sql server SQL-如何返回没有倍数的结果
我正在尝试编写一个业务对象报告,以显示在选定日期未返回时间表的人员列表,但我不知道如何停止为个人返回多个条目的SQL查询 My Staff_表包含两列-员工编号和姓名 我的时间表表包含员工编号和结束日期等内容 我可以轻松地编写一条语句,返回所有输入了一周结束日期为(例如,2012年8月10日)的时间表的用户。但是,如果我试图返回所有未填写2012年8月10日时间表的人的列表,我会选择表中没有该日期的每个时间表,因此,例如,如果一个人提交了100份时间表,其中只有一份是2012年8月10日的时间表,那么结果将显示他99次。 我需要的是Staff_表上所有未在该日期提交的人员的固定列表,仅显示一次 我尝试了一个不存在的联盟,但要么我做错了,要么就是根本不合适Sql server SQL-如何返回没有倍数的结果,sql-server,business-objects,Sql Server,Business Objects,我正在尝试编写一个业务对象报告,以显示在选定日期未返回时间表的人员列表,但我不知道如何停止为个人返回多个条目的SQL查询 My Staff_表包含两列-员工编号和姓名 我的时间表表包含员工编号和结束日期等内容 我可以轻松地编写一条语句,返回所有输入了一周结束日期为(例如,2012年8月10日)的时间表的用户。但是,如果我试图返回所有未填写2012年8月10日时间表的人的列表,我会选择表中没有该日期的每个时间表,因此,例如,如果一个人提交了100份时间表,其中只有一份是2012年8月10日的时间表
有人能给我指出正确的方向吗?尝试在查询中添加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
子句中使用未聚合列