SQL не дает ожидаемых результатов - PullRequest
2 голосов
/ 28 мая 2010

У меня есть три таблицы, связанные с этим конкретным запросом:

  • Lawson_Employees: LawsonID (pk), LastName, FirstName, AccCode (числовой)
  • Lawson_DeptInfo: AccCode (pk), AccCode2 (не спрашивайте, HR настроен), DisplayName
  • tblExpirationDates: EmpID (шт.), ACLS (дата), EP (дата), CPR (дата), CPR_Imported (дата), PALS (дата), Note

Цель состоит в том, чтобы получить данные, которые я должен сообщать обо всех тех, кто уже истек в одной или нескольких сертификациях или собирается истечь в течение следующих 90 дней.

Некоторые важные заметки:

  • Это выполняется как часть vbScript, поэтому 90-дневная дата рассчитывается при запуске сценария. Я использую 2010-08-31 в качестве заполнителя, так как это результат на момент публикации этого вопроса.
  • Срок действия всех карт истекает в конце месяца. (именно поэтому указанная дата относится к концу августа, а не к точкам 90 дней)
  • Действительная карта EP заменяет сертификацию ACLS, но для некоторых сотрудников требуется только последняя. (не собирался волноваться об этом, пока я не получу ответ на этот вопрос, но если я смогу получить помощь, я возьму это)
  • В столбце CPR указана дата окончания последнего класса, который они взяли с собой. (NULL, если они не брали у нас уроки)
  • Столбец CPR_Imported содержит дату окончания срока действия последнего класса, который они взяли где-то еще. (NULL, если они не брали его в другом месте, и браво для следования политике)
  • Различие между классами СЛР важно для других отчетов. Для целей настоящего отчета все, что нас действительно волнует, это то, какой из них является наиболее актуальным или, по крайней мере, текущим.
  • Если потребуется, я пока что буду игнорировать ACLS и PALS, так как именно несоблюдение условий обучения CPR является большой проблемой в данный момент. (не то чтобы другие не были, но они не были упомянуты на последнем собрании ...)

Вот мой запрос, который дает мне хорошие данные:

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;

После просмотра набора результатов, я думаю, что я пропускаю некоторые даты истечения срока, которые должны быть в наборе результатов. Я что-то пропустил? Это бесполезная часть того, чтобы быть единственным разработчиком в отделе ... никто не просит небольшой помощи.

1 Ответ

0 голосов
/ 28 мая 2010

Я думаю, что проблема здесь:

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

Нуль не меньше и не больше, чем что-либо.

Если вам нужны люди, у которых нет действительного СЛР, вам нужно будет включить нули.

Может быть проще всего использовать Nz:

 OR (Nz(Exp.CPR,#2010-08-31#) <= #2010-08-31# 
            AND Nz(Exp.CPR_Imported,#2010-08-31#) <= #2010-08-31#) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...