2015-01-21 2 views
0

다음 case 문은 올바르게 작동하지 않습니다. 모든 결과를 'i'(문에서 'Else'부분)로 생성합니다. 부분을 주석 처리하면 코드가 정상적으로 작동하여 기준이 충족되지 않는 경우 NULL이 생성됩니다. 왜 그런지 알고 싶습니다. ELSE는 지원되지 않습니까? 나는 Else가 Case 문에서 사용한 것을 본 적이있을 것이라고 확신합니다 (단 ).SQL Case 문이 'Else'와 함께 작동하지 않습니다.

SELECT 
     EN, 
     (First_Name + ' ' + Last_Name) as Name, 

     First_Aid =MAX(CASE 
      WHEN Course = 'First Aid' 
      and Status = 'Finished' 
      and Course_Start_Date > DATEADD(day, -1095, GETDATE()) 
      THEN 'F' 
      ELSE 'i' 
      END), 

     Manual_Handling =MAX(CASE 
      WHEN Course = 'Manual Handling' 
      and Status = 'Finished' 
      and Course_Start_Date > DATEADD(day, -1095, GETDATE()) 
      THEN 'F' 
      ELSE 'i' 
      END), 

     Fire_Safety =MAX(CASE 
      WHEN Course = 'Fire Safety' 
      and Status = 'Finished' 
      and Course_Start_Date > DATEADD(day, -1095, GETDATE()) 
      THEN 'F' 
      ELSE 'i' 
      END) 
into MyTraining 
FROM Learning_History 

Group By EN,First_Name, Last_Name 
+2

당신이 가지고있는 것은 본질적으로'MAX '('F ','i ')'입니다. 적어도 하나의 레코드가 기준과 일치하지 않으면 결과가 "i"입니다. 어떤 경우에도이'case'는'null'을 줄 것입니다 - 왜 그것을 기대합니까? – GSerg

+0

그리고 물론, 'else'가 없을 때 "작동"하는 이유는'max ('F', null)'이''F ''를 반환하기 때문입니다. 그것은 'else'의 잘못이 아니라 단지 로직의 작은 경과입니다. – Luaan

+0

그런 빠른 응답에 감사드립니다. 초급자로서 나는 나이를 먹으면 서 자신의 능력을 과다하게 생각하고 대답을 이해하지 못한다. 나쁘다. @ 루안 - 당신의 제안은 나에게 'F'를 얻는 코스 날짜가 있다는 것을 제외하고는 Else가 주석 처리 한 코드와 동일한 결과를 제공합니다. 어쩌면이 링크 는 내가 더 잘 이루고자하는 것을 보여줄 수 있습니까? – ttratl

답변

2

GSerg의 설명에 따르면 잘못된 것을 묻습니다. 당신은 아마이 대신 같은 쿼리를 사용하려면 다음 조건을 만족 아무것도 존재하지 않는 경우는

Fire_Safety =MAX(CASE 
WHEN Course = 'Fire Safety' 
and Status = 'Finished' 
and Course_Start_Date > DATEADD(day, -1095, GETDATE()) 
THEN Course_Start_Date 
ELSE null 
END) 

null을 당신에게 화재 안전 코스의 가까운 일을주고, 또는 것입니다. 그런 다음 T 또는 F 또는 반환 된 값을 기반으로 원하는 값을 반환해야하는 경우 다른 casemax 주위에 가질 수 있습니다. 아니면, 당신이 어떤 경우에 일어나길 원하는지 정말 명확하지 않다 :)

0

나는 집계 밖에서 I와 F로 과제를 풀기를 원한다고 생각한다. 하나의 방법이 있습니다 :

SELECT EN, 
     (First_Name + ' ' + Last_Name) as Name, 
     (CASE WHEN SUM(CASE WHEN Course = 'First Aid' and Status = 'Finished' and Course_Start_Date > DATEADD(day, -1095, GETDATE()) 
          THEN 1 ELSE 0 END) > 0 
      THEN 'F' ELSE 'I' 
     END) as First_Aid, 
     (CASE WHEN SUM(CASE WHEN course = 'Manual Handling' and Status = 'Finished' and Course_Start_Date > DATEADD(day, -1095, GETDATE()) > 0 
          THEN 1 ELSE 0 END) > 0 
      THEN 'F' ELSE 'I' 
     END) as Manual_Handling, 
     (CASE WHEN SUM(CASE WHEN Course = 'Fire Safety' and Status = 'Finished' and Course_Start_Date > DATEADD(day, -1095, GETDATE()) 
           THEN 1 ELSE 0 END) > 0 
      THEN 'F' 
      ELSE 'i' 
     END) as Fire_Safety 
into MyTraining 
FROM Learning_History 
Group By EN, First_Name, Last_Name 
+0

고든에게 감사드립니다. '>'근처에 잘못된 구문이 나타납니다. 중간 케이스 표현식에 여분의> 0이 있다는 것을 알았습니다. 나는 그것을 제거했지만 여전히 오류. – ttratl

관련 문제