我想将DOB转换为数字年龄,然后将年龄值分配到SQL Server上的不同年龄组。
我找到了第一步的方法,第二步理想情况下我应该将第一步的结果设置为变量并让它在CASE语句中进行比较。但是,我不知道声明并设置变量并在CASE中使用它。
我拿着我想要的桌子,傻逼如下:
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
我的问题:有没有办法将“FLOOR((CAST(GetDate()AS INTEGER) - CAST(DOB AS INTEGER))/ 365.25)”设置为变量并在其中使用CASE声明?
* FirstName,LastName和dbo是学生表中的列。
谢谢!
答案 0 :(得分: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
。如果您想更改边界,这会更容易。