2012-11-27 6 views
0

나는 nullnot nullErrorCode 필드로 설정하여 시도해 보니 case when입니다.SQL Server : 쿼리에서 'case'를 어떻게 사용합니까?

예.

EmpNo|ChkDate    |ChkIn     |ChkOut     |ErrorCode 
00001|2012-10-01 00:00:00.000|2012-10-01 07:21:00.000|2012-10-01 17:05:00.000|0 
00002|2012-10-01 00:00:00.000|2012-10-01 22:17:00.000|2012-10-01 00:00:00.000|6 
00003|2012-10-01 00:00:00.000|2012-10-01 00:00:00.000|2012-10-01 19:30:00.000|6 
00004|2012-10-01 00:00:00.000|NULL     |NULL     |7 
00005|2012-10-01 00:00:00.000|2012-10-01 07:10:00.000|2012-10-01 12:00:00.000|0 
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|0 

는하지만 난 출력 (ErrorCode가)

EmpNo|ChkDate    |ChkIn     |ChkOut     |ErrorCode 
00001|2012-10-01 00:00:00.000|2012-10-01 07:21:00.000|2012-10-01 17:05:00.000|0 
00002|2012-10-01 00:00:00.000|2012-10-01 22:17:00.000|2012-10-01 00:00:00.000|6 
00003|2012-10-01 00:00:00.000|2012-10-01 00:00:00.000|2012-10-01 19:30:00.000|6 
00004|2012-10-01 00:00:00.000|NULL     |NULL     |7 
00005|2012-10-01 00:00:00.000|2012-10-01 07:10:00.000|2012-10-01 12:00:00.000|8 
00006|2012-10-01 00:00:00.000|2012-10-01 13:50:00.000|2012-10-01 19:20:00.000|8 

이 ChkIn의 가치와 ChkOut이 반나절입니다 필요합니다. 나는 값 = 8을 설정할 필요하지만 난 = 0

이 코드 시도 :

SELECT 
    tf.EmpNo, tf.ChkDate, tf.ChkIn, tf.ChkOut, 
    CASE 
     WHEN ChkIn is not null and Convert(nvarchar(10), ChkOut,108) != '00:00:00' 
     THEN 0 
     WHEN ChkIn is not null and Convert(nvarchar(10) ,ChkOut,108) = '00:00:00' 
     THEN 6 
     WHEN Convert(nvarchar(10),ChkIn,108) = '00:00:00' and ChkOut is not null 
     THEN 6 
     WHEN Convert(nvarchar(10),ChkOut,108) <= '12:00:00' 
     OR Convert(nvarchar(10),ChkOut,108) >= '12:00:01' Then 8 
     WHEN ChkIn is null and ChkOut is null THEN 7 
    END as 'ErrorCode' 
FROM filesTA tf 
WHERE tf.ChkDate = '2012-10-01' 
+0

왜 EmpNo 1은 코드 0을 얻지 만 EmpNo 5와 6은 8을 얻습니까? 종일과 반나절을 어떻게 정의하고 있습니까? 경과 시간 계산 없이는 이들을 구별 할 수 없으며 기존 쿼리에서 논리가 무엇인지 알려주지 못합니다. 값 0, 6, 7 및 8을 행에 적용해야하는 경우보다 명확하게 설명하십시오. – ErikE

답변

0

문제가 될 것으로 보인다을 당신의 조건 "중복". 그 말은 초기 조건이 적용된다는 것을 의미합니다 (첫 번째 조건). 나중에 조건이 적용되지만 case 문은 첫 번째 일치에서 끝납니다.

당신이해야 할 일은 각 사례를 고유하게 식별 할 수 있도록 조건을 수정하는 것입니다.

첫 번째 조건은 이 null이 아니어야하고 ChkOut00:00:00이 아니어야한다고 말합니다. 이 조건은 결과가 8 일 것으로 예상되는 행에도 적용되지만 첫 번째 "일치"는 case 문으로 적용됩니다.

편집
나는, 그러나 확실히 출력이 0을 것으로 예상 될 때이 8 것으로 예상되는 경우에 대한 사용자의 요구 사항을 이해한다. 어쩌면 값을 반환해야하는지에 대한 정확한 조건을 조금 더 설명 할 수 있습니다. ChkIn에서 의 가치를 이해하는 데 문제가 있으며 ChkOut은 반나절입니다. 설정 값 = 8이 필요합니다.

0

사례 진술에서 사실을 잘못 앞에서 잘못 표시하지 않는 조건을 제공해야합니다. 다음을 시도해 보면 이전에 8을 계산할 수 있습니다.

SELECT 
    tf.EmpNo, tf.ChkDate, tf.ChkIn, tf.ChkOut, 
    CASE 
     WHEN Convert(nvarchar(10),ChkOut,108) <= '12:00:00' 
     OR Convert(nvarchar(10),ChkOut,108) >= '12:00:01' Then 8 
     WHEN ChkIn is not null and Convert(nvarchar(10), ChkOut,108) != '00:00:00' 
     THEN 0 
     WHEN ChkIn is not null and Convert(nvarchar(10) ,ChkOut,108) = '00:00:00' 
     THEN 6 
     WHEN Convert(nvarchar(10),ChkIn,108) = '00:00:00' and ChkOut is not null 
     THEN 6 
     WHEN ChkIn is null and ChkOut is null THEN 7 
    END as 'ErrorCode' 
FROM filesTA tf 
WHERE tf.ChkDate = '2012-10-01' 

그러나 이것은 0이 표시되지 않게합니다. 사실은 당신의 욕망이 분명하지 않다는 것입니다. 왜 EmpNo 1은 코드 0을 얻지 만 EmpNo 5와 6은 8을 얻는가? 종일과 반나절을 어떻게 정의하고 있습니까? 경과 시간 계산 없이는 이들을 구별 할 수 없으며 기존 쿼리에서 논리가 무엇인지 알려주지 못합니다. 값 0, 6, 7 및 8을 행에 적용해야하는 경우보다 명확하게 설명하십시오.

+0

그럴 경우, 그는 결코 가치 '0'을 반환하지 않을 것입니다, 그렇죠? –

+0

* 나는 그것을 알고있다. * 너는 그것을 안다. 하지만 그는 그렇지 않습니다. 따라서 그에게 문제의 본질을 실제로 보여줄 수있는 모범이됩니다. – ErikE