2011-01-10 7 views
6

Im Wesentlichen habe ich eine MySQL-Datenbank mit Benutzern und deren entsprechenden Geburtsdatum. Ich habe auch den folgenden Code gefunden, der mir helfen würde, das tatsächliche Alter des Benutzers ab dem Geburtsdatum zu finden. Finding date of birth Was ich tun muss, ist verschiedene Altersbanden zu finden und die Anzahl der Nutzer in dieser Altersgruppe zu zählen. Ich habe auch this Beispiel gefunden, das genau zeigt, wie diese Daten gruppiert werden. Ich möchte zuerst das Alter berechnen und es auf die gleiche Weise verwenden, wie in der folgenden Abbildung gezeigt link. Ich habe den folgenden Code geschrieben und bin immer einen Fehler, wenn es ausgeführt wird:Wie gruppiere ich die Anzahl der Benutzer nach Altersgruppen 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 

Ich erhalte eine Fehlermeldung besagt, dass das Feld Alter ist nicht bekannt. Schreib ich das falsch? Ich könnte leicht den ganzen Codeblock schreiben, der das Alter berechnet, in dem das Alter in der Case-Anweisung steht, aber das scheint sehr ineffizient zu sein. Ich bin (noch) nicht sehr gut in MySQL und ich weiß, dass es einen besseren Weg dafür geben muss. Ich denke, meine Hauptfrage ist, ob es eine Art gibt, eine Funktion innerhalb einer Abfrage zu erstellen und die Ausgabe dieser Funktion einem Wert zuzuordnen.

+0

Sie haben eine Menge extranous Code, um Alter zu bekommen. Du könntest einfach YEAR (CURDATE()) - YEAR (date_of_birth) als Alter – dqhendricks

+0

Das würde nur immer funktionieren, wenn alle am 1. Januar geboren wären ... – ODaniel

Antwort

14

In diesem Fall, dass Sie eine Unterabfrage verwenden können:

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; 

Also zuerst führt es die Unterabfrage und erstellt eine Tabelle von Alter, als sie den Alterswert aggregiert.

+0

Das ist Excellent! –

Verwandte Themen