我正在构建一个不允许重复的查询。我建立了一个任务/时间管理器,并在表中创建了一个名为“活动”的列。这是对/错的开关,表示员工是忙还是闲。我现在正在建立一个查询,在该查询中,如果“活动”开关为true,则显示为“忙”,否则为“免费”。我可以使它工作,但显示重复项。在表中,我确实将其编入索引以不显示重复项,但仍在获取它们。
这是SQL视图:
`SELECT Employees.Employee
, IIf([Active]=True,"Unavailable","Free") AS Avail
FROM tblTasks INNER JOIN Employees ON tblTasks.[User ID] = Employees.UserID;`
这是当前输出:
最终目标是得到它,以便如果任何员工在“活动”字段上具有“真”标志,则他们一次会显示为“不可用”,但是如果他们在活动字段上具有所有“假”标签,则会出现一次为“可用”。
任何帮助将不胜感激。
答案 0 :(得分:2)
选项:
SELECT Employees.UserID, Employee, IIf(CntTrue>0, "Unavailable", "Available") AS Status
FROM Employees
LEFT JOIN (SELECT Count(*) AS CntTrue, UserID FROM tblTasks
WHERE Active = True GROUP BY UserID) AS Q1
ON Employees.UserID = Q1.UserID;
或
SELECT Employees.*, IIf(Q1.UserID Is Null, "Available", "UnAvailable") AS Status
FROM Employees
LEFT JOIN (SELECT DISTINCT UserID FROM tblTasks WHERE Active = True) AS Q1
ON Employees.UserID = Q1.UserID;
或
SELECT UserID, Employee, IIf(DCount("*","tblTasks","Active=True AND UserID=" & [UserID])>0, "Unavailable", "Available") AS Status FROM Employees;
请注意使用LEFT JOIN来确保所有员工都被遣返。 INNER JOIN将排除未分配任务的员工。也许所有员工都有至少一项任务,但这允许一些可能性。
建议不要在命名约定中使用空格。
应该在“员工”中指定UserID作为主键。
答案 1 :(得分:0)
这将起作用:
select
e.employee,
max(iif(t.active, "Unavailable", "Free"))
from Employees e inner join tblTasks t
on t.userid = e.userid
group by e.userid, e.employee
因为字符串"Unavailable"
大于字符串"Free"
(或"Available"
)。
如果您选择其他字符串来表示可用性,则必须进行调整。
因此,如果您选择"Busy"
和"Free"
,则必须更改为:
select
e.employee,
min(iif(t.active, "Busy", "Free"))
from Employees e inner join tblTasks t
on t.userid = e.userid
group by e.userid, e.employee