Skip to content
Advertisement

Mysql Group By age by range [closed]

i need help, i need to create report like this

age     | total<br>
<= 13   | 10
14      | 0
15      | 5
16      | 2
....    | ....

the report is group by the age, but i can’t get when age under <= 13 to inside in 13 age, this is my query, it’s only work for same value, how to add value under 13 to be inside 13 age.

SELECT
              za_hours.za_hour AS age,
              IFNULL(COUNT(stonevoucherchild_claim_user_id), 0) AS total
            FROM
              (SELECT
                13 AS za_hour
              UNION
              SELECT
                14 AS za_hour
              UNION
              SELECT
                15 AS za_hour
              UNION
              SELECT
                16 AS za_hour
              UNION
              SELECT
                17 AS za_hour
              UNION
              SELECT
                18 AS za_hour
              UNION
              SELECT
                19 AS za_hour
              UNION
              SELECT
                20 AS za_hour
              UNION
              SELECT
                21 AS za_hour
              UNION
              SELECT
                22 AS za_hour
              UNION
              SELECT
                23 AS za_hour
              UNION
              SELECT
                24 AS za_hour
              UNION
              SELECT
                25 AS za_hour
              UNION
              SELECT
                26 AS za_hour
              UNION
              SELECT
                27 AS za_hour
              UNION
              SELECT
                28 AS za_hour
              UNION
              SELECT
                29 AS za_hour
              UNION
              SELECT
                30 AS za_hour) za_hours
              LEFT JOIN mu_users
                ON za_hours.za_hour = TIMESTAMPDIFF(YEAR, dob, CURDATE())
            GROUP BY za_hours.za_hour
            ORDER BY za_hours.za_hour;

please help me for this, and sorry for bad english

Advertisement

Answer

I would use a range comparison; this works by defining a start and end value in the union all derived table; then you can use between to put the users in groups. We can also provide a description for each range, that we will use in the outer query:

select n.info, count(u.dob) total
from (
    select '<= 13' info, 0 start, 13 end 
    union all select '= 14', 14, 14
    union all select '= 15', 15, 15
    ...
    union all select '= 30', 30, 30
) n
left join mu_users u
    on timestampdiff(year, u.dob, curdate()) between n.start and n.end
group by n.info, n.start, n.end
order by n.start
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement