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

Ron*_*ing 1 sql sql-server sql-server-2012

我有表的用户user_id,user_nameuser_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)

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

Boh*_*ian 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
Run Code Online (Sandbox Code Playgroud)

通过使用子查询将生日值转换为范围,计算只需要每行执行一次,因此它应该表现更好.它更容易阅读.

此外,通过避免使用UNION,可以在表上一次执行查询.