2011-01-10 21 views
6

Zasadniczo mam bazę danych mysql z użytkownikami i odpowiadającą im datą urodzenia. Znalazłem także następujący fragment kodu, który pomoże mi znaleźć rzeczywisty wiek użytkowników od daty urodzenia. Finding date of birth Muszę znaleźć różne "grupy wiekowe" i policzyć liczbę użytkowników w danym przedziale wiekowym. Znalazłem również przykład, który pokazuje dokładnie, jak pogrupować te dane. Chcę najpierw obliczyć wiek i użyć go w podobny sposób, jak pokazano poniżej: link. Napisałem następujący kod i otrzymuję błąd podczas uruchamiania go:Jak pogrupować liczbę użytkowników według przedziałów wiekowych w 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 

otrzymuję komunikat o błędzie informujący, że wiek pole nie jest znana. Czy piszę to niepoprawnie? Mogłabym łatwo napisać cały blok kodu, który oblicza wiek, w którym wiek jest zapisany w instrukcji sprawy, ale wydaje się to bardzo nieefektywne. Nie jestem zbyt dobry w mysql (jeszcze) i wiem, że musi być lepszy sposób na zrobienie tego. Domyślam się, że moje główne pytanie brzmi: czy istnieje jakiś sposób na utworzenie funkcji wewnątrz zapytania i przypisanie wyniku tej funkcji do wartości?

+0

masz kilka niezrozumiałych kodów, aby uzyskać wieki. możesz po prostu ROK (CURDATE()) - ROK (data_rodzenia) AS wiek – dqhendricks

+0

To by zawsze działało, gdyby wszyscy urodzili się 1 stycznia ... – ODaniel

Odpowiedz

14

W tym przypadku można użyć podzapytania:

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; 

Więc najpierw wykonuje podzapytania i buduje tabelę grup wiekowych, niż agreguje wartości wiekowej.

+0

To jest doskonałe! –

Powiązane problemy