我的表用户有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
有关如何存档以上格式的任何建议吗?
答案 0 :(得分:7)
将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
通过使用子查询将birthdate转换为范围,计算只需要每行执行一次,因此它应该表现更好。而且它更容易阅读。
此外,通过避免使用UNION,可以在表格中一次执行查询。
答案 1 :(得分:1)
获得所需内容的最简单方法是:
mtcars %>%
group_by(cyl, gear) %>%
do(data.frame(nrow=nrow(.)))
但实际上你应该考虑其他方法,例如grouping。