Запрос MS Access без дубликатов - PullRequest
0 голосов
/ 17 мая 2019

Я работаю над созданием запроса, в котором он не учитывает дубликаты.Я построил диспетчер задач / времени, и в таблице для него я создал столбец под названием «Активный».Это переключатель true / false, который показывает, занят ли работник или свободен.Сейчас я создаю запрос, в котором я хочу, чтобы он показывал, если переключатель «активный» имеет значение «истина», тогда он отображается как «Занят», в противном случае, если значение «ложь», они «Свободны».Я могу заставить это работать, но это показывает дубликаты.В таблице у меня есть индекс, чтобы не показывать дубликаты, но я все еще получаю их.

Вот представление SQL:

 `SELECT Employees.Employee
 , IIf([Active]=True,"Unavailable","Free") AS Avail
 FROM tblTasks INNER JOIN Employees ON tblTasks.[User ID] = Employees.UserID;`

Это текущая настройка: CurrentSetup

И это текущий вывод:

Output

В конечном итоге цель состоит в том, чтобы получить его таким образом, чтобы, если у любого сотрудника был флаг «Истина» в поле «Активный», он отображался один раз как «Недоступно », но если они имеют все« ложные »теги в поле« Активно », они отображаются один раз как« Доступные ».

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Опции:

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, чтобы гарантировать, что все сотрудникивернулся.ВНУТРЕННЕЕ СОЕДИНЕНИЕ исключило бы сотрудников, которым не была назначена задача.Возможно, у всех сотрудников есть хотя бы одна задача, но это допускает вероятность того, что некоторые этого не делают.

Не рекомендуется использовать пробелы в соглашении об именах.
Вероятно, следует указать UserID в Employees в качестве первичного ключа.

0 голосов
/ 17 мая 2019

Это будет работать:

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
...