2011-01-10 80 views
6

Básicamente, tengo una base de datos mysql con los usuarios y su fecha de nacimiento correspondiente. También encontré el siguiente fragmento de código que me ayudaría a encontrar la edad real de los usuarios a partir de la fecha de nacimiento. Finding date of birth Lo que necesito hacer es encontrar diferentes "bandas de edad" y contar la cantidad de usuarios en esa franja de edad. También encontré el ejemplo this que muestra exactamente cómo agrupar estos datos. Quiero calcular la edad primero y usarla de una manera similar a la que se muestra en el siguiente link. He escrito el siguiente código y estoy recibiendo un error cuando se ejecuta:Cómo agrupar el número de usuarios por franjas de edad en mysql

SELECT DATE_FORMAT(NOW(), '%Y') - 
DATE_FORMAT(data_of_birth, '%Y') - 
(DATE_FORMAT(NOW(), '00-%m-%d') < 
DATE_FORMAT(data_of_birth, 
'00-%m-%d')) AS age, COUNT(*), 
CASE 
    WHEN age >= 10 AND age <= 20 THEN '10-20' 
    WHEN age >=21 AND age <=30 THEN '21-30' 
    WHEN age >=31 AND age <=40 THEN '31-40' 
    WHEN age >=41 AND age <= 50 THEN '31-40' 
    WHEN age >=51 AND age <=60 THEN '51-60' 
    WHEN age >=61 THEN '61+' 
END AS ageband 
.. .. 
GROUP BY ageband 

me sale un error que indica que la edad campo no se conoce. ¿Estoy escribiendo esto incorrectamente? Podría escribir fácilmente todo el bloque de código que calcula la edad donde se escribe la edad en el enunciado de caso, pero esto parece ser muy ineficiente. No soy muy bueno en mysql (todavía) y sé que tiene que haber una mejor manera de hacerlo. Supongo que mi pregunta principal es si hay algún tipo de forma de crear una función dentro de una consulta y asignar la salida de esa función a un valor.

+0

tienes un montón de códigos extraños para envejecer. simplemente podría hacer AÑO (CURDATE()) - AÑO (date_of_birth) AS edad – dqhendricks

+0

Eso solo funcionaría siempre si todos nacieran el 1 de enero ... – ODaniel

Respuesta

14

En este caso se puede usar una subconsulta:

SELECT 
    COUNT(*), 
    CASE 
    WHEN age >=10 AND age <=20 THEN '10-20' 
    WHEN age >=21 AND age <=30 THEN '21-30' 
    WHEN age >=31 AND age <=40 THEN '31-40' 
    WHEN age >=41 AND age <=50 THEN '41-50' 
    WHEN age >=51 AND age <=60 THEN '51-60' 
    WHEN age >=61 THEN '61+' 
    END AS ageband 
FROM 
    (
    DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age, 
.. .. 
) as tbl 
GROUP BY ageband; 

Así que primero se ejecuta la subconsulta y construye una tabla de edades, lo que agrega el valor edad.

+0

¡Esto es excelente! –

Cuestiones relacionadas