2016-09-30 2 views
1

DOB를 숫자 나이로 변환 한 다음 SQL Server의 다른 연령 그룹에 나이 값을 할당하고 싶습니다.쿼리 된 값을 선언하고 CASE에서 사용하는 방법?

나는 첫 번째 단계를 수행하는 방법을 발견했으며 두 번째 단계는 첫 번째 단계의 결과를 변수로 설정하고 CASE 문에서 비교하도록해야합니다. 그러나, 나는 선언하고 변수를 설정하고 CASE에서 그것을 사용할지 모르겠다. CAST (-가) "로 설정 FLOOR ((CAST (에 GetDate() 정수 할 수있는 방법이 있나요 :

SELECT FirstName, LastName, 
    CAST(
     CASE 
      WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER))/365.25) < 18 
       THEN 'Under 18' 
      WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER))/365.25) BETWEEN 19 AND 30 
       THEN '19-30' 
      WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER))/365.25) > 30 
       THEN 'Over 30' 
      ELSE 'ERROR' 
    END AS VARCHAR(10)) AS Age 
FROM Student 

내 질문 :

나는 내가 다음과 같이 바보 같은 방법으로 원하는 테이블을 가지고 DOB AS INTEGER))/365.25) "를 변수로 사용하여 CASE 문에서 사용합니까?

* 이름, 성 및 dbo는 학생 표의 열입니다.

감사합니다.

답변

4

아니요, case 문에 없습니다. 두 가지 권장 사항은 CTE 또는 하위 쿼리를 사용하는 것입니다. 그러나, SQL Server는 apply을 지원

SELECT FirstName, LastName, 
     (CASE WHEN v.age <= 18 THEN 'Under 18' 
      WHEN v.age <= 30 THEN '19-30' 
      WHEN v.age > 30 THEN 'Over 30' 
      ELSE 'ERROR' 
     END) AS Age 
FROM Student s OUTER APPLY 
    (VALUES (FLOOR((CAST (GetDate() AS INTEGER) - CAST(dob AS INTEGER))/365.25)) 
    ) as v(age); 

댓글 : 당신은 varchar(10)에 문자열을 캐스팅

  • 필요가 없습니다. 그것은 단지 불필요한 것입니다.
  • case은 순서대로 평가되므로 between이 필요하지 않습니다. 이렇게하면 경계를 변경하려는 경우 훨씬 쉽게됩니다.
+0

고든 고든, 고든! –

관련 문제