Mysql 使用SQL选择年龄组
这是关于这一问题的后续问题。我在MySQL数据库中为用户的生日设置了一个日期字段,并使用以下查询获取年龄: 选择 ROUNDDATEDIFF 现在选择日期, 以生日为日期 /365岁,0岁 来自成员 现在,我需要选择不同年龄组的人数。例如,我需要知道13-17岁、18-21岁、22-25岁、26-35岁、36-50岁、51-MAX年龄组的人数 使用MySQL可能吗 我想到过工会,就像这样:Mysql 使用SQL选择年龄组,mysql,sql,database,Mysql,Sql,Database,这是关于这一问题的后续问题。我在MySQL数据库中为用户的生日设置了一个日期字段,并使用以下查询获取年龄: 选择 ROUNDDATEDIFF 现在选择日期, 以生日为日期 /365岁,0岁 来自成员 现在,我需要选择不同年龄组的人数。例如,我需要知道13-17岁、18-21岁、22-25岁、26-35岁、36-50岁、51-MAX年龄组的人数 使用MySQL可能吗 我想到过工会,就像这样: SELECT ROUND(DATEDIFF( Cast((SELECT NOW(
SELECT
ROUND(DATEDIFF(
Cast((SELECT NOW()) as Date),
Cast(birthday as Date)
) / 365, 0) as age,
1 as agegroup
FROM member WHERE age >=13 AND age <=17
UNION
SELECT
ROUND(DATEDIFF(
Cast((SELECT NOW()) as Date),
Cast(birthday as Date)
) / 365, 0) as age
2 as agegroup
FROM member WHERE age >=18 AND age <=21
SELECT
SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) AS under10,
SUM(CASE WHEN 10<age AND age <19 THEN 1 ELSE 0 END) AS age10to19,
.
.
.
FROM table
但那将是漫长而丑陋的。一定有更好的办法 如果您将年龄作为表中的一列,您可以这样做:
SELECT
ROUND(DATEDIFF(
Cast((SELECT NOW()) as Date),
Cast(birthday as Date)
) / 365, 0) as age,
1 as agegroup
FROM member WHERE age >=13 AND age <=17
UNION
SELECT
ROUND(DATEDIFF(
Cast((SELECT NOW()) as Date),
Cast(birthday as Date)
) / 365, 0) as age
2 as agegroup
FROM member WHERE age >=18 AND age <=21
select AgeGroup
, count(*)
from (
select case
when age between 13 and 17 then 1
when age between 18 and 21 then 2
...
end as AgeGroup
from (
SELECT ROUND(DATEDIFF(Cast(NOW() as Date),
Cast(birthday as Date)) / 365, 0) as age
FROM YourTable
) as SubQueryAlias
) as SubQueryAlias2
group by
AgeGroup
SELECT
SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) AS under10,
SUM(CASE WHEN 10<age AND age <19 THEN 1 ELSE 0 END) AS age10to19,
.
.
.
FROM table
可能会有一些小的变化,因为年龄不在它自己的列中,或者如果你想要额外的或不同的范围。我相信你能自己解决 如果您将年龄作为表中的一列,您可以这样做:
SELECT
ROUND(DATEDIFF(
Cast((SELECT NOW()) as Date),
Cast(birthday as Date)
) / 365, 0) as age,
1 as agegroup
FROM member WHERE age >=13 AND age <=17
UNION
SELECT
ROUND(DATEDIFF(
Cast((SELECT NOW()) as Date),
Cast(birthday as Date)
) / 365, 0) as age
2 as agegroup
FROM member WHERE age >=18 AND age <=21
SELECT
SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) AS under10,
SUM(CASE WHEN 10<age AND age <19 THEN 1 ELSE 0 END) AS age10to19,
.
.
.
FROM table
可能会有一些小的变化,因为年龄不在它自己的列中,或者如果你想要额外的或不同的范围。我相信你能自己解决 另一种可能的解决方案:-
SELECT AgeRange.MinAge, AgeRange.MaxAge, COUNT(*)
FROM
(
SELECT 13 AS MinAge, 17 AS MaxAge
UNION SELECT 18, 21
UNION SELECT 22, 25
UNION SELECT 26, 35
UNION SELECT 36, 50
UNION SELECT 51, 9999
) AgeRange
INNER JOIN YourTable
ON ROUND(DATEDIFF(CAST(NOW() as DATE), CAST(birthday as DATE)) / 365, 0) BETWEEN AgeRange.MinAge AND AgeRange.MaxAge
GROUP BY AgeRange.MinAge, AgeRange.MaxAge
如果需要,可以更容易地进行扩展,或者使用表格中的日期范围,以便用户在需要时可以轻松地更新生成的报告。另一种可能的解决方案:-
SELECT AgeRange.MinAge, AgeRange.MaxAge, COUNT(*)
FROM
(
SELECT 13 AS MinAge, 17 AS MaxAge
UNION SELECT 18, 21
UNION SELECT 22, 25
UNION SELECT 26, 35
UNION SELECT 36, 50
UNION SELECT 51, 9999
) AgeRange
INNER JOIN YourTable
ON ROUND(DATEDIFF(CAST(NOW() as DATE), CAST(birthday as DATE)) / 365, 0) BETWEEN AgeRange.MinAge AND AgeRange.MaxAge
GROUP BY AgeRange.MinAge, AgeRange.MaxAge
如果需要,可能更容易扩展,或者移动到使用表格中的日期范围,以便用户可以在需要时方便地更新生成的报告。表格是问题中OP显示的子选项,您也有一个拼写错误:否则9应该是其他0表格是问题中OP显示的子选项,您也有一个拼写错误:否则9应该是其他0