我有表的用户user_id
,user_name
和user_dob
。
我想统计一下18岁以下,18-50岁和50岁以上的用户数量。
年龄计算方法需要改进以计算准确的年龄,但现在我对寻找计数方法更感兴趣
所以我尝试了:
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)
它给我的结果是:
(No column name)
1218
3441
1540
但是我需要这样的东西
Range | Count
----------------
Under 18 | 1218
18-50 | 3441
Over 50 | 1540
有什么建议如何将上述格式存档?
将生日转换为范围名称,然后对带有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
通过使用子查询将生日日期转换为范围,该计算仅需要每行执行一次,因此它应该表现更好。而且更容易阅读。
此外,通过避免使用UNION,可以在表上执行一次查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句