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

Agrupar por Rango de Edades

Estas en el tema de Agrupar por Rango de Edades en el foro de Oracle en Foros del Web. Muy Buenas Tardes a todos estoy tratando de realizar una consulta donde me permita mostrar la cantidades de personas agrupadas por rango de edades de ...
  #1 (permalink)  
Antiguo 27/12/2011, 15:29
 
Fecha de Ingreso: diciembre-2011
Mensajes: 6
Antigüedad: 12 años, 3 meses
Puntos: 0
Agrupar por Rango de Edades

Muy Buenas Tardes a todos estoy tratando de realizar una consulta donde me permita mostrar la cantidades de personas agrupadas por rango de edades de una tabla de la siguiente forma:
============
Edad Cantidad
============
00-05 2,256
06-09 7,518
10-15 8,475
.
.
.
95-100 34

La Tabla es la siguiente:

select
e.cod_socio,
e.fec_nacimiento,
to_date(sysdate) as today,
(to_date(sysdate)-to_date(e.fec_nacimiento))/365 as age
from soc_socio e
where e.cod_empresa = '001'
and e.cod_sucursal = '003'
and e.tip_estado = 'A'
and e.fec_nacimiento >= '01-jan-1950'

Espero me puedan ayudar
Saludos.
  #2 (permalink)  
Antiguo 28/12/2011, 20:25
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Agrupar por Rango de Edades

Prueba con el ejemplo:

Código:
select case
 when ((to_date(sysdate)-to_date(e.fec_nacimiento))/365) <= 5 then '0-5' 
 when ((to_date(sysdate)-to_date(e.fec_nacimiento))/365) <= 9 then '6-9' 
 --etc..
  else 'mas de 100' 
end as age, 
count(*) as cantidad
from soc_socio
group by case
 when ((to_date(sysdate)-to_date(e.fec_nacimiento))/365) <= 5 then '0-5' 
 when ((to_date(sysdate)-to_date(e.fec_nacimiento))/365) <= 9 then '6-9' 
 --etc..
  else 'mas de 100' 
end
Saludos
  #3 (permalink)  
Antiguo 29/12/2011, 11:42
 
Fecha de Ingreso: diciembre-2011
Mensajes: 6
Antigüedad: 12 años, 3 meses
Puntos: 0
Desacuerdo Respuesta: Agrupar por Rango de Edades

Grande Matanga!!!
Usando tu logica se puede lograr la consulta agrupando muy bien los rangos. Lo habia estado trabajado tambien con CASE para crear los rangos y al agruparlos se me complicaba haciendo muuuuuy largo el query.

Ahora puedo incluir el BETWEEN para simplificarlo. Utilize ademas el comando FLOOR para aproximar la edad pero no es exacta, existe un comando para calcular la edad Real???
Gracias Nuevamente

Saludos. de Peru :D

SELECT
y.edad, COUNT(*) AS cantidad
FROM (
SELECT
(CASE x.age
WHEN 0 THEN '00_09'
WHEN 1 THEN '00_09'
WHEN 2 THEN '00_09'
WHEN 3 THEN '00_09'
(etc...)
WHEN 99 THEN '90_99'

ELSE 'OTROS'
END
) AS EDAD
FROM (
select
e.cod_socio,
e.fec_nacimiento,
to_date(sysdate) as today,
floor((to_date(sysdate)-to_date(e.fec_nacimiento))/365) as age
from soc_socio e
where e.cod_empresa = '001'
and e.cod_sucursal = '003'
and e.tip_estado IN ('A','C','S')
and e.fec_nacimiento >= '01-jan-1950'
order by 4 asc
) x
)y

GROUP BY y.edad
order by 1
  #4 (permalink)  
Antiguo 30/12/2011, 06:44
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: Agrupar por Rango de Edades

Hola William,

Te paso el link de un post viejito ya, pero muy util para sacar la edad de las personas.

http://www.forosdelweb.com/f100/resu...s-dias-539703/

El resultado se expresa en años, en meses, en semanas y en dias.

Si la resta de fechas te da en años exactos, no muestra meses ni semanas ni dias.
Si la resta de fechas no es exacta en años, muestra los meses y si la resta no da igual en meses, muestras las semanas y sino aun asi no da igual muestra los dias tambien.

Espero sea de ayuda.
Saludos, Mario.
__________________
Y venció David al filisteo con honda y piedra; e hirió al filisteo y lo mató, sin tener David espada en su mano.
  #5 (permalink)  
Antiguo 02/01/2012, 09:00
 
Fecha de Ingreso: diciembre-2011
Mensajes: 6
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Agrupar por Rango de Edades

Gracias MarioHeredia, muy interesante el query ya me imagino las horas que se dedico al rompecabezas jeje

Tengo una complicacion con la resta de fechas solo menores a 1950 salen en negativo, alguien sabe porque???????

floor((to_date(sysdate)-to_date(e.fec_nacimiento))/365) as age


Gracias a Todos Nuevamente Saludos.
  #6 (permalink)  
Antiguo 02/01/2012, 20:20
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 1 mes
Puntos: 360
Respuesta: Agrupar por Rango de Edades

Este post es similar al que comparte mario heredia.

http://www.forosdelweb.com/f100/como...a-edad-720984/

En una sola consulta quedaría

Código SQL:
Ver original
  1. SELECT FLOOR(months_between(sysdate, to_date('&&fecha','YYYY-MM-DD'))/12) || ' Años ' ||
  2.        FLOOR(MOD(months_between(sysdate, to_date('&&fecha','YYYY-MM-DD')),12)) || ' Meses ' ||
  3.        FLOOR((MOD(months_between(sysdate, to_date('&&fecha','YYYY-MM-DD')),12) - FLOOR(MOD(months_between(sysdate, to_date('&fecha','YYYY-MM-DD')),12)))*30) || ' Dias' AS edad
  4. FROM dual;

La razón por la que se generan números negativos es por que las funciones to_date y to_char realiza operaciones entre las fechas basada en el siglo comprendido entre 1950 y 2049.

Estas seguro que la fecha que tienes almacenada es inferior a 1950? fec_nacimiento que tipo de dato tiene?
Cuando ejecutas
Código SQL:
Ver original
  1. SELECT
  2. e.cod_socio,
  3. e.fec_nacimiento,
  4. to_char(e.fec_nacimiento,'YYYY-MM-DD') AS fecha
  5. FROM soc_socio e
  6. WHERE e.cod_empresa = '001'
  7. AND e.cod_sucursal = '003'
  8. AND e.tip_estado = 'A'
  9. AND e.fec_nacimiento < to_date('1950-01-01','YYYY-MM-DD')

te retorna valores?

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: agrupar, rango, select, 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 02:35.