Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用SQL选择年龄组_Mysql_Sql_Database - Fatal编程技术网

Mysql 使用SQL选择年龄组

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(

这是关于这一问题的后续问题。我在MySQL数据库中为用户的生日设置了一个日期字段,并使用以下查询获取年龄:

选择 ROUNDDATEDIFF 现在选择日期, 以生日为日期 /365岁,0岁 来自成员 现在,我需要选择不同年龄组的人数。例如,我需要知道13-17岁、18-21岁、22-25岁、26-35岁、36-50岁、51-MAX年龄组的人数

使用MySQL可能吗

我想到过工会,就像这样:

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