Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

agrupar por rango de edades

Estas en el tema de agrupar por rango de edades en el foro de Mysql en Foros del Web. Hola, tengo una tabla usuarios que esta de la siguiente manera: id---nombre---fechaNacimiento 1---luis----2000-05-01 2---jose----1985-08-23 3---hugo----1983-05-05 4---carlos----2001-12-09 y mas Quiero hacer 3 cosas en una misma ...
  #1 (permalink)  
Antiguo 17/07/2012, 11:18
 
Fecha de Ingreso: diciembre-2006
Mensajes: 381
Antigüedad: 17 años, 3 meses
Puntos: 2
agrupar por rango de edades

Hola, tengo una tabla usuarios que esta de la siguiente manera:
id---nombre---fechaNacimiento
1---luis----2000-05-01
2---jose----1985-08-23
3---hugo----1983-05-05
4---carlos----2001-12-09
y mas

Quiero hacer 3 cosas en una misma sentencia sql, primero quiero calcular las edades de cada usuario, eso se puede hacer con su fecha de nacimiento y agruparlos por su edad para tener el total por edad, eso ya lo hice de esta manera:

SELECT (YEAR(CURDATE())-YEAR(fechaNacimiento)) - (RIGHT(CURDATE(),5)<RIGHT(fechaNacimiento,5)) AS edad,
COUNT(*) AS cantidad
FROM usuarios
GROUP BY edad
ORDER BY id ASC

pero en esa misma consulta debo agruparlos por rangos.
osea de la edad de 5-15 años me debe dar el total de usuarios, de 16 a 20 , me debe dar el total y asi.
el resultado final debe ser mas o menos asi:
rango---total
5-15 años---10
16-20 años---15
21-30 años---6

como puedo hacerlo?
Gracias.
  #2 (permalink)  
Antiguo 17/07/2012, 12:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: agrupar por rango de edades

Hola StrikeFreedom:

Lo puedes hacer con un IF o un CASE-WHEN anidado... en lugar de solamente calcular la edad, clasificas también cada registro, sería más o menos así (No pongo la parte del cálculo de la edad)

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+--------+------+
  3. | id   | nombre | edad |
  4. +------+--------+------+
  5. |    1 | luis   |   12 |
  6. |    2 | jose   |   26 |
  7. |    3 | hugo   |   29 |
  8. |    4 | carlos |   10 |
  9. |    5 | leo    |   31 |
  10. +------+--------+------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT
  14.     ->   CASE WHEN (edad BETWEEN 10 AND 19) THEN 'De 10 a 19' ELSE
  15.     ->     CASE WHEN (edad BETWEEN 20 AND 29) THEN 'De 20 a 29' ELSE
  16.     ->       CASE WHEN (edad >= 20) THEN 'De 30 o más'
  17.     ->       END
  18.     ->     END
  19.     ->   END rango,
  20.     ->   COUNT(*) total
  21.     -> FROM tabla
  22.     -> GROUP BY rango;
  23. +------------+-------+
  24. | rango      | total |
  25. +------------+-------+
  26. | De 10 a 19 |     2 |
  27. | De 20 a 29 |     2 |
  28. | De 30 o m  |     1 |
  29. +------------+-------+
  30. 3 rows in set, 2 warnings (0.00 sec)

El único cuidado que debes tener es que todos tus rangos sean excluyentes, es decir, que no se empalmen datos. También podrías presentar los datos en un solo registro... esto podrías hacerlo con sumas condicionales:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   SUM(IF (edad BETWEEN 10 AND 19, 1, 0)) De_10_a_19,
  3.     ->   SUM(IF (edad BETWEEN 20 AND 29, 1, 0)) De_20_a_29,
  4.     ->   SUM(IF (edad >= 30, 1, 0)) De_30_o_mas
  5.     -> FROM tabla;
  6. +------------+------------+-------------+
  7. | De_10_a_19 | De_20_a_29 | De_30_o_mas |
  8. +------------+------------+-------------+
  9. |          2 |          2 |           1 |
  10. +------------+------------+-------------+
  11. 1 row in set (0.00 sec)

Saludos
Leo.

Etiquetas: agrupar, rango, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:17.