Ron*_*ing 1 sql sql-server sql-server-2012
我有表的用户user_id,user_name和user_dob.
我想算一下18岁以下,18-50岁以上和50岁以下的用户数量.
需要改进Age计算方法来计算确切的年龄,但是现在我更感兴趣的是找到计算方法
所以我尝试过:
SELECT COUNT ([user_id])
from [user]
where (DATEDIFF(yy,[user_dob], GETDATE()) < 18)
UNION ALL
SELECT COUNT ([user_id])
from [user]
where (DATEDIFF(yy,[user_dob], GETDATE()) >= 18 AND DATEDIFF(yy,[user_dob], GETDATE()) <=50)
UNION ALL
SELECT COUNT ([user_id])
from [user]
where (DATEDIFF(yy,[user_dob], GETDATE()) > 50)
Run Code Online (Sandbox Code Playgroud)
它给我的结果如下:
(No column name)
1218
3441
1540
Run Code Online (Sandbox Code Playgroud)
但我需要这样的东西
Range | Count
----------------
Under 18 | 1218
18-50 | 3441
Over 50 | 1540
Run Code Online (Sandbox Code Playgroud)
有关如何存档以上格式的任何建议?
将birthdate转换为范围名称,然后使用count计数组:
select
case when age < 18 then 'Under 18'
when age > 50 then 'Over 50'
else '18-50' end as range,
count(*) as count
from (select DATEDIFF(yy, user_dob, GETDATE()) as age from Customer) c
group by case when age < 18 then 'Under 18'
when age > 50 then 'Over 50'
else '18-50' end
Run Code Online (Sandbox Code Playgroud)
通过使用子查询将生日值转换为范围,计算只需要每行执行一次,因此它应该表现更好.它更容易阅读.
此外,通过避免使用UNION,可以在表上一次执行查询.