2010-05-27 4 views
2

J'ai trois tableaux liés à cette requête particulière:SQL ne donne des résultats attendus

  • Lawson_Employees: LawsonID (pk), LastName, FirstName, AccCode (numérique)
  • Lawson_DeptInfo: AccCode (pk), AccCode2 (ne demandez pas, RH mis en place), DisplayName
  • tblExpirationDates: EmpID (Pk), ACLS (date), EP (date), CPR (date), CPR_Imported (date), PALS (date), Note

Le but est d'obtenir les données que je dois faire rapport sur tous ceux qui ont déjà expiré dans un ou plusieurs certification, ou vont expirer dans les 90 journées.

Quelques remarques importantes:

  • C'est en cours d'exécution dans le cadre d'un VBscript, de sorte que la date de 90 jours est calculé lorsque le script est exécuté. J'utilise 2010-08-31 comme espace réservé puisque c'est le résultat au moment où cette question est affichée.
  • Toutes les cartes expirent à la fin du mois. (c'est pourquoi la date ci-dessus est pour la fin août et non pas 90 jours sur le point)
  • Une carte EP valide remplace la certification ACLS, mais seule cette dernière est requise pour certains employés. (n'allait pas s'inquiéter à ce sujet jusqu'à ce que j'ai obtenu cette réponse, mais si je peux obtenir l'aide je la prends)
  • La colonne CPR contient la date d'expiration pour la dernière classe qu'ils ont prise avec nous. (NULL s'ils n'ont pris aucune classe avec nous)
  • La colonne CPR_Imported contient la date d'expiration de la dernière classe qu'ils ont prise ailleurs. (NULL s'ils ne l'ont pas pris ailleurs, et bravo pour la politique suivante)
  • La distinction entre les classes de RCP est importante pour d'autres rapports. Aux fins du présent rapport, tout ce qui nous intéresse vraiment est de savoir lequel est le plus récent - ou du moins est actuellement à jour.
  • Si je le dois, j'ignorerai ACLS et PALS pour le moment car c'est la non-conformité avec la formation de CPR qui est le gros problème en ce moment. (Pas que les autres ne seront pas, mais ils ne sont pas mentionnés dans la dernière réunion ...)

Voici la question que j'ai à ce jour, ce qui me donne de bonnes données:

SELECT 
    iEmp.LawsonID, iEmp.LastName, iEmp.FirstName, 
    dept.AccCode2, dept.DisplayName, 
    Exp.ACLS, Exp.EP, Exp.CPR, Exp.CPR_Imported, Exp.PALS, Exp.Note 
FROM (Lawson_Employees AS iEmp 
     LEFT JOIN Lawson_DeptInfo AS dept ON dept.AccCode = iEmp.AccCode) 
     LEFT JOIN tblExpirationDates AS Exp ON iEmp.LawsonID = Exp.EmpID 
WHERE iEmp.CurrentEmp = 1 
    AND ((Exp.ACLS <= #2010-08-31# 
      AND Exp.ACLS IS NOT NULL) 
     OR (Exp.CPR <= #2010-08-31# 
      AND Exp.CPR_Imported <= #2010-08-31#) 
     OR (Exp.PALS <= #2010-08-31# 
      AND Exp.PALS IS NOT NULL)) 
ORDER BY dept.AccCode2, iEmp.LastName, iEmp.FirstName; 

Après avoir parcouru le jeu de résultats, je pense qu'il me manque des dates d'expiration qui devraient être dans le jeu de résultats. Est-ce que je manque quelque chose? C'est la partie sucky d'être le seul développeur dans le département ... personne pour demander un peu d'aide.

Répondre

0

Je pense que le problème est ici:

OR (Exp.CPR <= #2010-08-31# 
      AND Exp.CPR_Imported <= #2010-08-31#) 

nul n'est pas inférieure ou supérieure à rien.

Si vous avez besoin des personnes qui n'ont pas de RCP valide, vous devrez inclure des valeurs nulles.

Il peut être plus facile à utiliser Nz:

OR (Nz(Exp.CPR,#2010-08-31#) <= #2010-08-31# 
      AND Nz(Exp.CPR_Imported,#2010-08-31#) <= #2010-08-31#) 
+1

Il est en fait pas nécessaire d'utiliser Nz() pour cela, et je vous recommande d'éviter les appels de fonctions inutiles. –

+0

Alors, que recommandez-vous? Il semblerait à partir de l'OP que les données ne sont pas retournées, il est probable que cela est dû au fait que les valeurs nulles sont exclues. C'est de loin la chose la plus facile à utiliser Nz. Et je ne vois pas l'intérêt de voter un commentaire généralisé quand cela pourrait bien être l'exception à moins qu'une solution de rechange ne soit proposée. – Fionnuala

+0

@Remount, je reçois des résultats. Ils ont l'air incomplet. Nous avons eu une panne de réseau vendredi, donc je ne serai pas en mesure de tester les réponses jusqu'à mardi (le bureau est fermé lundi pour les vacances) – AnonJr

Questions connexes