2

ユーザー向けのオンライン調査があり、ユーザーが調査に回答するたびに、次のような「survey_stats」テーブルに詳細をキャプチャします-

| 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  |

つまり、ユーザーが調査に回答すると、ユーザーの属性 (性別、年齢、関係) を 3 つの行 (ユーザーに関する個別の属性ごとに各行) で取得します。この方法を維持している理由は、将来ユーザー属性を拡張したい場合、survey_stats テーブル構造を変更する代わりに、調査ごとにレコードを追加するだけでよいためです。

次のようなレポートを生成する SQL を作成したいと思います。

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

そのための単一の SQL ステートメントを作成する方法を教えていただければ幸いです。

参考までに - 私は MySQL を使用しています。上記のプロジェクトは Ruby on Rails アプリです。

どうもありがとう。

4

1 に答える 1

4
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
于 2012-04-14T13:55:25.623 に答える