Je veux afficher tous les users disponibles (type d'user: employé) à une date donnée. Ils ne sont pas disponibles s'ils sont programmés les deux jours (PM / AM)
Voici mes tables suivantes:
Types d'users
TypeID TypeName 1 Admin 2 Employee
Utilisateurs
UserID TypeID Name 1 1 Admin 1 2 2 Employee 1 3 2 Employee 2 4 1 Admin 2 5 2 Employee 3 6 2 Employee 4 7 2 Employee 5
Programme
SchedID UserID SchedDate Day (PM/AM) 1 2 8/27/2013 PM 2 2 8/27/2013 AM 3 3 8/27/2013 AM 4 5 8/27/2013 PM 5 6 8/27/2013 AM
Résultat attendu (WHERE SchedDate = '8/27/2013')
UserID Name 3 Employee 2 5 Employee 3 6 Employee 4 7 Employee 5
C'est ma déclaration SQL actuelle:
SELECT Users.UserID, Users.Name FROM Users LEFT OUTER JOIN Schedule ON Schedule.UserID = Users.UserID WHERE Users.TypeID = 5
Disons ceci un peu différemment. Un user n'est pas disponible si AM et PM sont programmés pour la colonne DAY
. Sinon, l'user est disponible.
Étant donné qu'il n'y a que deux valeurs dans cette colonne, la requête suivante effectue le filtrage souhaité:
SELECT u.UserID, u.Name FROM Users u LEFT OUTER JOIN Schedule s ON s.UserID = u.UserID and s.ScheduleDate = '2013-08-27' WHERE u.TypeID = 5 GROUP BY u.UserID, u.Name HAVING COUNT(distinct s.day) < 2;
Si vous savez que les valeurs ne sont jamais répétées, vous pouvez modifier la clause having
pour:
HAVING COUNT(*) < 2;
C'est un peu un truc. Quand il n'y a aucune correspondance dans la table de planification, les counts renvoient 0
(dans le premier cas) ou 1
(dans le second cas).
SELECT USERS.USERID, USERS.NAME FROM USERS WHERE NOT EXISTS (SELECT SCHEDID FROM SCHEDULE WHERE SCHEDULE.USERID = USERS.USERID AND DAY = 'AM') AND NOT EXISTS (SELECT SCHEDID FROM SCHEDULE WHERE SCHEDULE.USERID = USERS.USERID AND DAY = 'PM')