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

Grupos de edad

Estas en el tema de Grupos de edad en el foro de Mysql en Foros del Web. Hola amigos pueden ayudarme con una consulta SQL para crear estadisticas, ya que se desea agrupar por grupos de edad de 0-19, 10-19, 20-29, etc ...
  #1 (permalink)  
Antiguo 24/05/2011, 14:20
 
Fecha de Ingreso: enero-2011
Ubicación: la paz
Mensajes: 53
Antigüedad: 13 años, 9 meses
Puntos: 3
Grupos de edad

Hola amigos

pueden ayudarme con una consulta SQL para crear estadisticas, ya que se desea agrupar por grupos de edad de 0-19, 10-19, 20-29, etc

hasta ahora lo hice por separado de 0-9 y otro de 10-19


no hay una forma de hacerlo todo en uno ya sea por PL/SQL

gracias por su tiempo
  #2 (permalink)  
Antiguo 24/05/2011, 14:48
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Grupos de edad

Hola rick_korn:

Me hubiera gustado que nos pusieras algo del código que intentaste hacer, para poder ayudarte a finar la sentencia. Tampoco nos das mucha información acerca de cómo está formada tu tabla, qué campos utilizas para hacer las comparaciones ni tampoco nos dices cómo quieres presentar las salida, Con esto resulta muy difícil tratar ayudarte, pero trataré de adivinar qué es lo que necesitas.

Checa este script:

Código MySQL:
Ver original
  1. mysql> create table TablaEdades (id int, descripcion varchar(10), edad int);
  2. Query OK, 0 rows affected (0.19 sec)
  3.  
  4. mysql> insert into TablaEdades values
  5.     -> (1, 'uno', 10), (2, 'dos', 15),(3, 'tres', 21),
  6.     -> (4, 'cuatro', 26), (5, 'cinco', 22), (6, 'seis', 31),
  7.     -> (7, 'siete', 17), (8, 'ocho', 28), (9, 'nueve', 28), (10, 'diez', 39);
  8. Query OK, 10 rows affected (0.05 sec)
  9. Records: 10  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from TablaEdades;
  12. +------+-------------+------+
  13. | id   | descripcion | edad |
  14. +------+-------------+------+
  15. |    1 | uno         |   10 |
  16. |    2 | dos         |   15 |
  17. |    3 | tres        |   21 |
  18. |    4 | cuatro      |   26 |
  19. |    5 | cinco       |   22 |
  20. |    6 | seis        |   31 |
  21. |    7 | siete       |   17 |
  22. |    8 | ocho        |   28 |
  23. |    9 | nueve       |   28 |
  24. |   10 | diez        |   39 |
  25. +------+-------------+------+
  26. 10 rows in set (0.02 sec)
  27.  
  28. mysql> #Para presentar la información en forma de columnas
  29. mysql> select
  30.     -> sum(if(edad between 10 and 19, 1, 0)) 10_19,
  31.     -> sum(if(edad between 20 and 29, 1, 0)) 20_29,
  32.     -> sum(if(edad between 30 and 39, 1, 0)) 39_39,
  33.     -> count(*) total
  34.     -> from TablaEdades;
  35. +-------+-------+-------+-------+
  36. | 10_19 | 20_29 | 39_39 | total |
  37. +-------+-------+-------+-------+
  38. |     3 |     5 |     2 |    10 |
  39. +-------+-------+-------+-------+
  40. 1 row in set (0.00 sec)
  41.  
  42. mysql> #Para presentar la información en forma de renglones
  43. mysql> select rango, count(*) from
  44.     -> (
  45.     -> select
  46.     -> case when edad between 0 and 9 then "20_9"
  47.     -> when edad between 10 and 19 then "10_19"
  48.     -> when edad between 20 and 29 then "20_29"
  49.     -> when edad between 30 and 39 then "30_39"
  50.     -> when edad > 39 then "mas_9" end rango
  51.     -> from TablaEdades
  52.     -> ) T
  53.     -> group by rango
  54.     -> union
  55.     -> select "total", count(*) from TablaEdades;
  56. +-------+----------+
  57. | rango | count(*) |
  58. +-------+----------+
  59. | 10_19 |        3 |
  60. | 20_29 |        5 |
  61. | 30_39 |        2 |
  62. | total |       10 |
  63. +-------+----------+
  64. 4 rows in set (0.00 sec)

Si esto no te sirve entonces atiende a lo que te comento al principio y danos un poco más de información, y en lo subsecuente, cuando publiques alguna otra pregunta recuerda también este punto. Entre más información nos puedas dar más fácil será tratar de ayudarte, no importa que te tardes algún tiempo en redactar tu mensaje. es preferible a poner cuatro lineas de texto y esperar que los demás adivinen el resto. Ojo con eso.

Saludos
Leo.
  #3 (permalink)  
Antiguo 24/05/2011, 16:03
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Grupos de edad

Hola rick_korn

Cita:
no hay una forma de hacerlo todo en uno ya sea por PL/SQL
Trabajas con mysql o con oracle?

Adicional a los que dice leonardo, a la ultima consulta (información en forma de renglones) en vez de adicionarle el UNION para mostrar el total utilizaría el modificador ROLLUP. También quitaría la subconsulta ya que no sería necesaria

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->      (CASE WHEN edad BETWEEN 0 AND 9 THEN "20_9"
  3.     ->      WHEN edad BETWEEN 10 AND 19 THEN "10_19"
  4.     ->      WHEN edad BETWEEN 20 AND 29 THEN "20_29"
  5.     ->      WHEN edad BETWEEN 30 AND 39 THEN "30_39"
  6.     ->      WHEN edad > 39 THEN "mas_9" END) rangos,count(*) AS conteo
  7.     ->      FROM TablaEdades
  8.     ->      GROUP BY rangos WITH ROLLUP;
  9. +--------+--------+
  10. | rangos | conteo |
  11. +--------+--------+
  12. | 10_19  |      3 |
  13. | 20_29  |      5 |
  14. | 30_39  |      2 |
  15. | NULL   |     10 |
  16. +--------+--------+
  17. 4 rows in set (0.00 sec)
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 24/05/2011 a las 16:10
  #4 (permalink)  
Antiguo 25/05/2011, 07:59
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Grupos de edad

Cita:
Iniciado por huesos52 Ver Mensaje
Adicional a los que dice leonardo, a la ultima consulta (información en forma de renglones) en vez de adicionarle el UNION para mostrar el total utilizaría el modificador ROLLUP. También quitaría la subconsulta ya que no sería necesaria
Como siempre acertado Huesos52... había olvidado por completo que se puede hacer con ROLLUP. Gracias por refrescar mi memoria.

Saludos
Leo.
  #5 (permalink)  
Antiguo 25/05/2011, 12:17
 
Fecha de Ingreso: enero-2011
Ubicación: la paz
Mensajes: 53
Antigüedad: 13 años, 9 meses
Puntos: 3
Respuesta: Grupos de edad

Gracias leonardo_josue por tu explicación me sirvio de mucho, y tambien gracias huesos52 por optimizar la consulta

saludos a la distancia
  #6 (permalink)  
Antiguo 23/12/2011, 11:59
 
Fecha de Ingreso: diciembre-2011
Mensajes: 6
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: Grupos de edad

Hola leonardo_josue y huesos52, cual seria el equivalente de la consulta en oracle 10g ya que al utilizar BETWEEN 10 AND 19 dentro de un DECODE no me deja el PL/SQL.

Espero que me puedan ayudar.
Saludos.
  #7 (permalink)  
Antiguo 23/12/2011, 12:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Grupos de edad

Pregunto yo: ¿No sería mejor que pregutaras eso directamente en el Foro de Oracle?
A fin de cuentas, Oracle tiene un foro específico, y los que se dedican a él andan más por allí que por acá...

Yendo directamente al tema, DECODE() funciona como un IF/THEN/ELSE, donde las condiciones son el primer parámetro, pero se supone que esperan operadores lógicos. BETWEEN no es exactamente un operador lógico porque no devuelve TRUE o FALSE, sino un operador relacional, el cual que determina un rango, por lo que puede ser incompatible con el DECODE.
Creo que sería mejor que no lo usaras en el DECODE, y realizases la consulta de una forma un poco más ortodoxa.
Pregunta en el Foro de Oracle.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 26/12/2011, 14:48
 
Fecha de Ingreso: diciembre-2011
Mensajes: 6
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: Grupos de edad

Gracias por la explicacion gnzsoloyo, voy a considerar tu consejo y publicar la consulta en otro foro.
Saludos.
  #9 (permalink)  
Antiguo 30/08/2012, 17:03
Avatar de lizeth_puch  
Fecha de Ingreso: abril-2012
Mensajes: 2
Antigüedad: 12 años, 6 meses
Puntos: 0
Sonrisa Respuesta: Grupos de edad

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola rick_korn:

Me hubiera gustado que nos pusieras algo del código que intentaste hacer, para poder ayudarte a finar la sentencia. Tampoco nos das mucha información acerca de cómo está formada tu tabla, qué campos utilizas para hacer las comparaciones ni tampoco nos dices cómo quieres presentar las salida, Con esto resulta muy difícil tratar ayudarte, pero trataré de adivinar qué es lo que necesitas.

Checa este script:

Código MySQL:
Ver original
  1. mysql> create table TablaEdades (id int, descripcion varchar(10), edad int);
  2. Query OK, 0 rows affected (0.19 sec)
  3.  
  4. mysql> insert into TablaEdades values
  5.     -> (1, 'uno', 10), (2, 'dos', 15),(3, 'tres', 21),
  6.     -> (4, 'cuatro', 26), (5, 'cinco', 22), (6, 'seis', 31),
  7.     -> (7, 'siete', 17), (8, 'ocho', 28), (9, 'nueve', 28), (10, 'diez', 39);
  8. Query OK, 10 rows affected (0.05 sec)
  9. Records: 10  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from TablaEdades;
  12. +------+-------------+------+
  13. | id   | descripcion | edad |
  14. +------+-------------+------+
  15. |    1 | uno         |   10 |
  16. |    2 | dos         |   15 |
  17. |    3 | tres        |   21 |
  18. |    4 | cuatro      |   26 |
  19. |    5 | cinco       |   22 |
  20. |    6 | seis        |   31 |
  21. |    7 | siete       |   17 |
  22. |    8 | ocho        |   28 |
  23. |    9 | nueve       |   28 |
  24. |   10 | diez        |   39 |
  25. +------+-------------+------+
  26. 10 rows in set (0.02 sec)
  27.  
  28. mysql> #Para presentar la información en forma de columnas
  29. mysql> select
  30.     -> sum(if(edad between 10 and 19, 1, 0)) 10_19,
  31.     -> sum(if(edad between 20 and 29, 1, 0)) 20_29,
  32.     -> sum(if(edad between 30 and 39, 1, 0)) 39_39,
  33.     -> count(*) total
  34.     -> from TablaEdades;
  35. +-------+-------+-------+-------+
  36. | 10_19 | 20_29 | 39_39 | total |
  37. +-------+-------+-------+-------+
  38. |     3 |     5 |     2 |    10 |
  39. +-------+-------+-------+-------+
  40. 1 row in set (0.00 sec)
  41.  
  42. mysql> #Para presentar la información en forma de renglones
  43. mysql> select rango, count(*) from
  44.     -> (
  45.     -> select
  46.     -> case when edad between 0 and 9 then "20_9"
  47.     -> when edad between 10 and 19 then "10_19"
  48.     -> when edad between 20 and 29 then "20_29"
  49.     -> when edad between 30 and 39 then "30_39"
  50.     -> when edad > 39 then "mas_9" end rango
  51.     -> from TablaEdades
  52.     -> ) T
  53.     -> group by rango
  54.     -> union
  55.     -> select "total", count(*) from TablaEdades;
  56. +-------+----------+
  57. | rango | count(*) |
  58. +-------+----------+
  59. | 10_19 |        3 |
  60. | 20_29 |        5 |
  61. | 30_39 |        2 |
  62. | total |       10 |
  63. +-------+----------+
  64. 4 rows in set (0.00 sec)

Si esto no te sirve entonces atiende a lo que te comento al principio y danos un poco más de información, y en lo subsecuente, cuando publiques alguna otra pregunta recuerda también este punto. Entre más información nos puedas dar más fácil será tratar de ayudarte, no importa que te tardes algún tiempo en redactar tu mensaje. es preferible a poner cuatro lineas de texto y esperar que los demás adivinen el resto. Ojo con eso.

Saludos
Leo.
Me sirvio de mucho leonardo_josue,
a su aportacion la modifique segun la necesitaba, le añadi que me lo separe en hombres y muejeres y me quedo asi:
Código MySQL:
Ver original
  1. SELECT        RANGO_DE_EDADES, SUM(Hombres) AS HOMBRES, SUM(Mujeres) AS MUJERES, COUNT(*) AS TOTAL
  2. FROM            (SELECT        CASE WHEN edad < 20 THEN 'MENOS DE 20 AÑOS' WHEN edad BETWEEN 20 AND 25 THEN 'DE 20 A 25 AÑOS' WHEN edad BETWEEN 26 AND
  3.                                                     35 THEN 'DE 26 A 35 AÑOS' WHEN edad BETWEEN 36 AND 44 THEN 'DE 36 A 44 AÑOS' WHEN edad BETWEEN 45 AND
  4.                                                     54 THEN 'DE 45 A 54 AÑOS' WHEN edad >= 55 THEN '55 O MAS AÑOS' END AS RANGO_DE_EDADES, (CASE WHEN sexo = 'M' THEN 1 ELSE 0 END)
  5.                                                     AS Hombres, (CASE WHEN sexo = 'F' THEN 1 ELSE 0 END) AS Mujeres
  6.                           FROM            Calidad) AS T
  7. GROUP BY RANGO_DE_EDADES, Hombres, Mujeres
  8. SELECT        'Total' AS Expr1, COUNT(*) AS numhom, COUNT(*) AS Expr3, COUNT(*) AS Expr4
  9. FROM            Calidad AS Calidad_1,
mi problema esq la fila que le añadi con el UNION ALL no me cuenta el resultado de las columnas como soluciono eso :(

me muestra este resultado
Código MySQL:
Ver original
  1. Rango_de_edades| Hombres| Mujueres |Total
  2. DE 20 A 25 AÑOS   | 0         |2            |2
  3. DE 26 A 35 AÑOS   | 2         |0            |2
  4. DE 36 A 44 AÑOS   | 1         |0            |1
  5. DE 45 A 54 AÑOS   |1          |0           |1
  6. Total             | 6         |6          |6
el total de la fila de abajo es la q no me esta sumando cuanto hombres y mujeres tengo solo me pone el resultado de cuantos son el total, los resultados de las filas si estan bien :D

Etiquetas: edad, grupos
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:44.