2011-01-10 13 views
6

In sostanza, ho un database mysql con utenti e la relativa data di nascita. Ho anche trovato il seguente bit di codice che mi avrebbe aiutato a trovare l'età effettiva dell'utente dalla data di nascita. Finding date of birth Quello che devo fare è trovare "fasce d'età" diverse e contare la quantità di utenti in quella fascia d'età. Ho anche trovato l'esempio this che mostra esattamente come raggruppare questi dati. Voglio calcolare prima l'età e usarla in un modo simile come mostrato nel seguente link. Ho scritto il seguente codice e sto ottenendo un errore durante l'esecuzione di esso:Come raggruppare il numero di utenti per fasce di età in 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 

ottengo un errore che indica che l'età di campo non è noto. Sto scrivendo questo in modo errato? Potrei facilmente scrivere l'intero blocco di codice che calcola l'età in cui l'età è scritta nella dichiarazione del caso, ma questo sembra essere molto inefficiente. Non sono molto bravo in mysql (ancora) e so che ci deve essere un modo migliore per farlo. Credo che la mia domanda principale sia se esiste un modo per creare una funzione all'interno di una query e assegnare l'output di quella funzione a un valore?

+0

hai un sacco di codice estraneo per invecchiare. potresti semplicemente fare ANNO (CURDATE()) - YEAR (date_of_birth) AS età – dqhendricks

+0

Che funzionerebbe sempre solo se tutti fossero nati il ​​1 ° gennaio ... – ODaniel

risposta

14

In questo caso è possibile utilizzare una sottoquery:

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; 

Quindi, prima si esegue la subquery e costruisce una tabella di età, che si aggrega al valore di età.

+0

Questo è eccellente! –

Problemi correlati