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

Dividir edades comprendidas

Estas en el tema de Dividir edades comprendidas en el foro de Mysql en Foros del Web. Hola tengo la siguiente consulta de una base de datos: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original select fecha_nac , COUNT ( fecha_nac ) from t_paciente ...
  #1 (permalink)  
Antiguo 02/11/2012, 09:20
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 9 años, 2 meses
Puntos: 1
Pregunta Dividir edades comprendidas

Hola tengo la siguiente consulta de una base de datos:
Código MySQL:
Ver original
  1. select fecha_nac,COUNT(fecha_nac)
  2. from t_paciente
  3. GROUP BY fecha_nac
Esos registros guardan datos de esta forma:

1 | 18
2 | 22
3 | 24
4 | 22
5 | 50
6 | 62

Lo que quiero es poder comprender entre edades de esta forma:

Contar y comprender entre:

Todos los <18

Todos los que estan entre 18 y 30 años

Todos los que estan entre 31 y 50 años

Todos los que estan entre 51 y 70 años

Todos los que estan entre 71 y 90 años

Espero su ayuda, si necesitan alguna otra información diganmelo porfa!

Mil gracias
__________________
Sé parte de nuestro mundo creativo.

http://bbcreativos.com

Última edición por gnzsoloyo; 02/11/2012 a las 10:06 Razón: No se permite codigo de programacion en los foros de BBDD
  #2 (permalink)  
Antiguo 02/11/2012, 15:43
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 13 años, 2 meses
Puntos: 47
Respuesta: Dividir edades comprendidas

Hola mira te hice este codigo es posible que los que saben mas de esto te lo puedan hacer mas reducido quizas con select case pero bueno en fin este lo probe y funciona:
Código MySQL:
Ver original
  1. IF (
  2.     FLOOR(DATEDIFF(now(),fecha) / 365) < 18,
  3.     "Menor a 18",
  4.     IF (
  5.         FLOOR(DATEDIFF(now(),fecha) / 365) >= 18 AND
  6.         FLOOR(DATEDIFF(now(),fecha) / 365) <=30,
  7.         "Entre 18 y 30",
  8.         IF (
  9.             FLOOR(DATEDIFF(now(),fecha) / 365) >= 30 AND
  10.             FLOOR(DATEDIFF(now(),fecha) / 365) <= 50,
  11.             "Entre 30 y 50",
  12.             IF (
  13.                 FLOOR(DATEDIFF(now(),fecha) / 365) >= 50AND
  14.                 FLOOR(DATEDIFF(now(),fecha) / 365) <= 70,
  15.                 "Entre 50 y 70",
  16.                 IF (
  17.                     FLOOR(DATEDIFF(now(),fecha) / 365) >= 70 AND
  18.                     FLOOR(DATEDIFF(now(),fecha) / 365) <= 90,
  19.                     "Entre 70 y 90",
  20.                     IF (
  21.                         FLOOR(DATEDIFF(now(),fecha) / 365) >= 90AND
  22.                         FLOOR(DATEDIFF(now(),fecha) / 365) <=100,
  23.                         "Entre 90 y 100",
  24.                         "Otra Edad"
  25.                     )
  26.                 )
  27.             )
  28.         )  
  29.     )  
  30. )
  31. FROM temp;

Lo primero que hago es calcular la edad de la persona en base a su fecha de nacimiento para eso uso DATEDIFF(now(),fecha); que lo que hace es restar la fecha actual con el campo fecha de la tabla, como DATEDIFF devuelve dicho calculo en dias al mismo lo divido por 365, a ese resultado le aplico la funcion FLOOR que lo que hace es redondear para abajo el resultado ya que por ejemplo 12.5 años en realidad como resultado de edad son 12.

El resto es mas facil son IFS anidados, la sintaxis del if de mysql es IF (CONDICION,VERDADERO,FALSO), entonces lo que hago es:

IF (edad (representada por floor(datediff etc) < 18 ,"Menor a 18" (devuelve menor a 18 en la vista) , ACA SI NO SE CUMPLE LA CONDICION HAGO EL OTRO IF) asi voy haciendo con todos los casos hasta llegar al ultimo donde en el lugar la condicion donde va la parte falsa en lugar de otro if coloco "otra edad" en caso de que la persona sea mayor a 100 años por ejemplo

Fijate si te funciona y me avisas.

Salu2

Última edición por djaevi; 03/11/2012 a las 07:45
  #3 (permalink)  
Antiguo 05/11/2012, 13:17
Avatar de dvbeaumont  
Fecha de Ingreso: marzo-2011
Ubicación: Caracas
Mensajes: 145
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Dividir edades comprendidas

Para esto el campo de fecha debe ser DATE? Yo estoy haciendo los registros con sus numeros:

Por ejm: si tiene 22 años entonces se sube a la base de datos esto:

fecha_nac = 22

Lo que tu me indicas es por fecha correcto?

Slds,
__________________
Sé parte de nuestro mundo creativo.

http://bbcreativos.com
  #4 (permalink)  
Antiguo 05/11/2012, 15:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 13 años, 5 meses
Puntos: 447
Respuesta: Dividir edades comprendidas

Hola dvbeaumont:

Almacenar la edad es un terrible error de diseño... lo que debes hacer, como lo menciona djaevi, sería almacenar la fecha de nacimiento y a partir de ella calcular la EDAD... de lo contrario todas las consultas que hagas estarían supeditadas a que tengas la información actualizada, pero bueno, al margen de esto vayamos con el problema... hay dos formas en que pudieras contabilizar los registros y presentar la información... una sería en forma de columnas y otra en forma de renglones:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM edades;
  2. +------+------+
  3. | id   | edad |
  4. +------+------+
  5. |    1 |   18 |
  6. |    2 |   22 |
  7. |    3 |   24 |
  8. |    4 |   22 |
  9. |    5 |   50 |
  10. |    6 |   62 |
  11. +------+------+
  12. 6 rows in set (0.04 sec)
  13.  
  14. mysql> SELECT
  15.     ->   SUM(IF(edad < 20, 1, 0)) Menos_de_20,
  16.     ->   SUM(IF(edad BETWEEN 20 AND 30, 1, 0)) Entre_20_y_30,
  17.     ->   SUM(IF(edad > 30, 1, 0)) Mas_de_30
  18.     -> FROM edades;
  19. +-------------+---------------+-----------+
  20. | Menos_de_20 | Entre_20_y_30 | Mas_de_30 |
  21. +-------------+---------------+-----------+
  22. |           1 |             3 |         2 |
  23. +-------------+---------------+-----------+
  24. 1 row in set (0.00 sec)
  25.  
  26. mysql> SELECT edad, COUNT(edad) FROM
  27.     -> ( SELECT
  28.     ->    CASE WHEN EDAD < 20 THEN "menos de 18" ELSE
  29.     ->      CASE WHEN EDAD BETWEEN 20 AND 30 THEN "entre 20 y 30"  ELSE
  30.     ->        CASE WHEN EDAD > 30 THEN "mas de 30"
  31.     ->        END
  32.     ->      END
  33.     ->    END edad
  34.     ->  FROM edades ) T
  35.     -> GROUP BY edad;
  36. +---------------+-------------+
  37. | edad          | COUNT(edad) |
  38. +---------------+-------------+
  39. | entre 20 y 30 |           3 |
  40. | mas de 30     |           2 |
  41. | menos de 18   |           1 |
  42. +---------------+-------------+
  43. 3 rows in set (0.00 sec)

Dale un vistazo para ver si te sirve

Saludos
Leo.

Etiquetas: dividir, registros, select, sql
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 07:11.