2012-04-14 17 views
0

ich eine Online-Umfrage für meine Nutzer haben, und jedes Mal, Benutzer beantwortet eine Umfrage, ich ihre Details in einer „survey_stats“ Tabelle wie folgt erfassen würde -MySQL - Gruppe durch mehrere Zeilen

| id  | user_id | survey_id | key   | value | 
|---------|---------|-----------|--------------|---------| 
|  1 |  10 |  99 | gender  | male | 
|  2 |  10 |  99 | age   | 32  | 
|  3 |  10 |  99 | relationship | married | 
|  4 |  11 |  99 | gender  | female | 
|  5 |  11 |  99 | age   | 27  | 
|  6 |  11 |  99 | relationship | single | 

Mit anderen Worten: Wenn ein Benutzer eine Umfrage beantwortet, würde ich die Attribute des Benutzers (Geschlecht, Alter, Beziehung) in drei Zeilen erfassen (jede Zeile für jedes einzelne Attribut über den Benutzer). Der Grund, warum wir diesen Weg beibehalten, ist, wenn wir die Benutzerattribute in Zukunft erweitern wollen, können wir einfach mehr Datensätze pro Umfrage hinzufügen, anstatt die Tabellenstruktur von survey_stats zu ändern.

würde Ich mag eine SQL konstruieren Bericht wie folgt zu generieren:

| age_group | male | female | 
|-----------|-------|---------| 
| 13 - 17 | 10 |  7 | 
| 18 - 24 | 25 |  10 | 
| 25 - 34 | 30 |  11 | 

Würde schätzen wirklich etwas Hilfe, mir zu zeigen, wie eine einzelne SQL-Anweisung zu schreiben, dies zu tun.

FYI - Ich benutze MySQL. Das genannte Projekt ist eine Ruby on Rails App.

Vielen Dank.

Antwort

2
select 
     case when YT2.age between 13 and 17 then "13 - 17" 
      when YT2.age bewteen 18 and 24 then "18 - 24" 
      when YT2.age between 25 and 35 then "25 - 34" 
      else "35 and over" end as AgeGroup, 
     Sum(if(YT1.value = "male", 1, 0)) as MaleFlag, 
     SUM(if(YT1.value = "female", 1, 0)) as FemaleFlag 
    from 
     YourTable YT1 
     JOIN YourTable YT2 
      ON YT1.user_id = YT2.user_ID 
      AND YT1.survey_id = YT2.survey_id 
      AND YT2.key = "age" 
    where 
     YT1.Key = "gender" 
    group by 
     AgeGroup 
+0

Vielen Dank, @DRapp! – keewooi

Verwandte Themen