如何根据出生年份将人们分成年龄段 (SQL)
How to separate people into age buckets, given birth year (SQL)
给定 birth_year 和 personal_id,我想创建 var "age",然后按 personal_id 分组到 2018 年的年龄段(范围)。
我尝试过的:
SELECT personal_id, (2018 - birth_year) AS age
FROM mydatabase
WHERE birth_year is not null
GROUP BY CASE
WHEN age between 18 and 24 THEN '18-24'
WHEN age between 25 and 34 THEN '25-34'
WHEN age between 35 and 44 THEN '35-44'
WHEN age between 45 and 54 THEN '45-54'
WHEN age between 55 and 64 THEN '55-64'
WHEN age > 64 THEN '65+'
END
我收到一条错误消息,提示 "age" 不是列名。我假设 CASE 语句可能需要嵌套,如下所示:
SELECT personal_id
FROM
(SELECT personal_id, (2018 - birth_year) as age,
CASE
WHEN age between 18 and 24 THEN '18-24'
WHEN age between 25 and 34 THEN '25-34'
WHEN age between 35 and 44 THEN '35-44'
WHEN age between 45 and 54 THEN '45-54'
WHEN age between 55 and 64 THEN '55-64'
WHEN age > 64 THEN '65+'
ELSE 0
END AS age_group
FROM mydatabase
).
这背后的理想是 "age" 先创建 var,然后再对人进行存储。
我希望这已经足够清楚了。谢谢!
使用APPLY
:
SELECT agegrp, COUNT(*)
FROM mydatabase d CROSS APPLY
(VALUES (2018 - birth_year)) v1(age) CROSS APPLY
(VALUES (CASE WHEN v1.age between 18 and 24 THEN '18-24'
WHEN v1.age between 25 and 34 THEN '25-34'
WHEN v1.age between 35 and 44 THEN '35-44'
WHEN v1.age between 45 and 54 THEN '45-54'
WHEN v1.age between 55 and 64 THEN '55-64'
WHEN v1.age > 64 THEN '65+'
END)
) v(agegrp)
WHERE birth_year is not null
GROUP BY agegrp;
我将您的查询更改为聚合查询,所以它有意义。
不允许内联别名
SELECT personal_id, CASE
WHEN (2018 - birth_year) between 18 and 24 THEN '18-24'
WHEN (2018 - birth_year) between 25 and 34 THEN '25-34'
WHEN (2018 - birth_year) between 35 and 44 THEN '35-44'
WHEN (2018 - birth_year) between 45 and 54 THEN '45-54'
WHEN (2018 - birth_year) between 55 and 64 THEN '55-64'
WHEN (2018 - birth_year) > 64 THEN '65+' AS age_grop
FROM mydatabase
WHERE birth_year is not null
GROUP BY CASE
WHEN (2018 - birth_year) between 18 and 24 THEN '18-24'
WHEN (2018 - birth_year) between 25 and 34 THEN '25-34'
WHEN (2018 - birth_year) between 35 and 44 THEN '35-44'
WHEN (2018 - birth_year) between 45 and 54 THEN '45-54'
WHEN (2018 - birth_year) between 55 and 64 THEN '55-64'
WHEN (2018 - birth_year) > 64 THEN '65+'
END,personal_id
给定 birth_year 和 personal_id,我想创建 var "age",然后按 personal_id 分组到 2018 年的年龄段(范围)。
我尝试过的:
SELECT personal_id, (2018 - birth_year) AS age
FROM mydatabase
WHERE birth_year is not null
GROUP BY CASE
WHEN age between 18 and 24 THEN '18-24'
WHEN age between 25 and 34 THEN '25-34'
WHEN age between 35 and 44 THEN '35-44'
WHEN age between 45 and 54 THEN '45-54'
WHEN age between 55 and 64 THEN '55-64'
WHEN age > 64 THEN '65+'
END
我收到一条错误消息,提示 "age" 不是列名。我假设 CASE 语句可能需要嵌套,如下所示:
SELECT personal_id
FROM
(SELECT personal_id, (2018 - birth_year) as age,
CASE
WHEN age between 18 and 24 THEN '18-24'
WHEN age between 25 and 34 THEN '25-34'
WHEN age between 35 and 44 THEN '35-44'
WHEN age between 45 and 54 THEN '45-54'
WHEN age between 55 and 64 THEN '55-64'
WHEN age > 64 THEN '65+'
ELSE 0
END AS age_group
FROM mydatabase
).
这背后的理想是 "age" 先创建 var,然后再对人进行存储。
我希望这已经足够清楚了。谢谢!
使用APPLY
:
SELECT agegrp, COUNT(*)
FROM mydatabase d CROSS APPLY
(VALUES (2018 - birth_year)) v1(age) CROSS APPLY
(VALUES (CASE WHEN v1.age between 18 and 24 THEN '18-24'
WHEN v1.age between 25 and 34 THEN '25-34'
WHEN v1.age between 35 and 44 THEN '35-44'
WHEN v1.age between 45 and 54 THEN '45-54'
WHEN v1.age between 55 and 64 THEN '55-64'
WHEN v1.age > 64 THEN '65+'
END)
) v(agegrp)
WHERE birth_year is not null
GROUP BY agegrp;
我将您的查询更改为聚合查询,所以它有意义。
不允许内联别名
SELECT personal_id, CASE
WHEN (2018 - birth_year) between 18 and 24 THEN '18-24'
WHEN (2018 - birth_year) between 25 and 34 THEN '25-34'
WHEN (2018 - birth_year) between 35 and 44 THEN '35-44'
WHEN (2018 - birth_year) between 45 and 54 THEN '45-54'
WHEN (2018 - birth_year) between 55 and 64 THEN '55-64'
WHEN (2018 - birth_year) > 64 THEN '65+' AS age_grop
FROM mydatabase
WHERE birth_year is not null
GROUP BY CASE
WHEN (2018 - birth_year) between 18 and 24 THEN '18-24'
WHEN (2018 - birth_year) between 25 and 34 THEN '25-34'
WHEN (2018 - birth_year) between 35 and 44 THEN '35-44'
WHEN (2018 - birth_year) between 45 and 54 THEN '45-54'
WHEN (2018 - birth_year) between 55 and 64 THEN '55-64'
WHEN (2018 - birth_year) > 64 THEN '65+'
END,personal_id