2010-05-27 6 views
2
를 산출하지

나는이 특정 쿼리에 관련된 세 개의 테이블이 있습니다SQL은 예상 결과

  • Lawson_Employees : LawsonID (PK), LastName, FirstName, AccCode (숫자)
  • Lawson_DeptInfo : AccCode (PK), AccCode2EmpID (PK), ACLS (날짜), EP (날짜), CPR (날짜),: DisplayName
  • tblExpirationDates을 (HR이 설정 요구하지 않음) 076,973,210 (날짜), PALS (날짜), Note

목표는 이미 하나 개 이상의 인증에 만료 모든 사람들에 대해보고하는 데 필요한 데이터를 얻을 수 있습니다, 또는 다음 90 만료 예정 일.

몇 가지 중요한 참고 사항 :

  • 이것은 VBScript를의 일부로 실행되는, 그래서 스크립트가 실행될 때 90 일 날짜가 계산되고있다. 이 질문이 게시 될 당시의 결과이므로 자리 표시 자로 2010-08-31을 사용하고 있습니다.
  • 모든 카드는 월말에 만료됩니다. (위의 날짜가 8 월 말과 90 일이 아닌 이유입니다.)
  • 유효한 EP 카드는 ACLS 인증을 대신하지만 일부 직원에게는 후자 만 필요합니다. (이 질문에 대한 답변을 얻을 때까지 그것에 대해 걱정하지 않을 것이지만, 도움을받을 수 있다면 받아 들일 것입니다.)
  • CPR 열은 그들이 우리에게 가져간 마지막 수업의 만료 날짜를 포함합니다. (그들이 우리와 함께 수업을 듣지 않았다면 NULL)
  • CPR_Imported 열은 그들이 다른 곳에서 가져간 마지막 수업의 만료일을 포함합니다. (다른 곳으로 옮기지 않으면 NULL, 다음 정책에 대해서는 bravo)
  • 다른 보고서에서는 CPR 클래스를 구분하는 것이 중요합니다. 이 보고서의 목적을 위해 우리가 정말로 염두에 두는 것은 가장 최근의 것이거나 적어도 현재 현재의 것입니다.
  • 내가해야한다면, ACLS와 PALS는 당분간 큰 문제인 심폐 소생술 훈련을 준수하지 않아 무시할 것입니다. (다른 사람이되지 않습니다하지 않는 것이, 그러나 그들은 ... 마지막 회의에서 언급되지 않은) 여기

나에게 좋은 데이터를주고 내가 지금까지 가지고있는 쿼리입니다 :

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; 

결과 집합을 검토 한 결과 결과 집합에 있어야하는 만료 날짜가 누락되었다고 생각합니다. 내가 놓친 게 있니? 이것은 부서에있는 유일한 개발자가되는 짜증나는 부분입니다 ... 작은 도움을 요청할 아무도.

답변

0

나는 문제가 여기에있다 생각 :

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

널 아무것도보다보다 작거나 크다.

유효한 CPR이없는 사람들이 필요한 경우, 널 (null)을 포함해야합니다.

이되는 Nz를 사용하는 것이 가장 쉬운 방법 일 수 있습니다

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

가 이것에 대한되는 Nz()를 사용할 필요는 실제로 없다, 나는 불필요한 함수 호출을 피하는 것을 권 해드립니다. –

+0

그래서 무엇을 권하고 싶습니까? 그것은 데이터가 반환되지 않습니다 OP에서 나타납니다, 그것은 nulls가 제외되고 있기 때문에 가능성이 높습니다. Nz를 사용하는 것이 훨씬 쉬운 방법입니다. 그리고 대체 솔루션이 제시되지 않는 한 이것이 예외 일 수있는 경우 일반화 된 의견을 표결하는 데 아무런 의미가 없습니다. – Fionnuala

+0

@Remount, 결과가 다시 나타납니다. 그들은 단지 불완전 해 보입니다. 우리는 화요일 (사무실은 휴일로 월요일 휴무입니다)까지 답변을 테스트 할 수 없으므로 – AnonJr