根据出生日期计算特定年龄范围内的用户数

时间:2016-01-16 02:30:08

标签: sql sql-server sql-server-2012

我的表用户有user_iduser_nameuser_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

有关如何存档以上格式的任何建议吗?

2 个答案:

答案 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