2

居住国ごとにグループ化された投稿数に関して、一部のユーザーの年齢に関するレポートを生成する必要があります。

これが私のスキーマの簡略化されたバージョンです。

DESCRIBE countries;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(45) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

DESCRIBE users;
+------------+---------+------+-----+---------+----------------+
| Field      | Type    | Null | Key | Default | Extra          |
+------------+---------+------+-----+---------+----------------+
| id         | int(11) | NO   | PRI | NULL    | auto_increment |
| age        | int(11) | NO   |     | NULL    |                |
| country_id | int(11) | NO   | MUL | NULL    |                |
+------------+---------+------+-----+---------+----------------+

DESCRIBE posts;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| content | text        | NO   |     | NULL    |                |
| user_id | int(11)     | NO   | MUL | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

そして、次のような結果セットが必要です。

country.name | AVG(age of users with 0 posts) | AVG(age of users with 1-5 posts | AVG(age of users with 1-5 posts
----------------------------------------
Denmark  | 17.4   | 23.2   | NULL
Germany  | 20.1   | 27.8   | 34.7
England  | 31.1   | NULL   | 28.3

ここで、NULL は、特定のポスト カウント レベルでユーザーがいない国を表します。たとえば、デンマークでは全員が 0 ~ 5 件の投稿を持っており、それ以上の投稿はありません。NULL である必要はないと思いますが、この値が未定であることは明らかです。

これまでのところ、これは私のクエリです:

SELECT
    c.name,
    AVG(something) AS avg_age_with_no_posts,
    AVG(something) AS `avg_age_with_1-5_posts`,
    AVG(something) AS `avg_age_with_gt5_posts`
FROM
    users u
    JOIN posts p ON p.user_id=u.id
    JOIN countries c ON c.id=u.country_id
GROUP BY c.id;

大したことではないことはわかっていますが、実際には他の句(ネストされたselect、HAVING、COUNT(CASE ... WHEN ...))をかなり(数時間)失敗させました。上記のクエリは、私が必要だとわかっている基本的なものです。

ありがとう!

4

1 に答える 1

1

試す

 Select c.name,
    Avg(Case When pc.postCount == 0 Then pc.Age End) avgAgeNoPosts,
    Avg(Case When pc.postCount Between 1 And 5 Then pc.Age End) avgAge1_5Posts,
    Avg(Case When pc.postCount > 5 Age End) Then pc.Age End) avgAgeGT5Posts
 From users u
    Join countries c On c.id=u.country_id
    Join (Select user_id uid, Count(*) postCount
          From posts
          Group By user_id ) pc
       On pc.UId = u.id
 Group By c.name

Sum(Case When ... End)式が else なしで機能する理由を説明すると、When 句で指定されたオプションがどれも true でない場合、null が出力されます。また、すべての集計演算子 ( Sum() を含む) は null を無視します。

于 2012-11-02T16:28:26.900 に答える