0

次の表について、ユーザーごと、1日あたりのメッセージ数をカウントしたいと思います。

+---------+---------+------------+
| msg_id  | user_id | m_date     |
+-------------------+------------+
|   1     | 1       | 2011-01-21 |
|   2     | 1       | 2011-01-23 |
|   3     | 1       | 2011-01-23 |
|   5     | 2       | 2011-01-23 |
|   6     | 2       | 2011-01-24 |
|   8     | 1       | 2011-01-23 |
|   9     | 2       | 2011-01-23 |
|  10     | 1       | 2011-01-24 |
+---------+---------+------------+

望ましいアウトパーは次のようになります。

1 2011-01-21 1
2 2011-01-21 0
1 2011-01-22 0
2 2011-01-22 0
1 2011-01-23 3
2 2011-01-23 2
1 2011-01-24 1
2 2011-01-24 1

次のクエリを使用します。

SELECT m_date, COUNT(msg_id ) AS volume
FROM messages
GROUP BY user_id, m_date
ORDER BY user_id, m_date ASC 

しかし、ここでは、ボリュームがゼロの日が結果セットから除外されています。

1 2011-01-21 1
1 2011-01-23 3
2 2011-01-23 2
1 2011-01-24 1
2 2011-01-24 1

しかし、私はその日を結果セットに入れたいと思っています。したがって、結果が必要なすべての日付を含む「daterange」テーブルを使用する必要があることを理解しました。

+---------+------------+
| date_id | d_date     |
+---------+------------+
| 1       | 2011-01-21 |
| 2       | 2011-01-22 |
| 3       | 2011-01-23 |
| 4       | 2011-01-24 |
+---------+------------+

ただし、必要な結果セットを取得するために、最初のテーブルに従ってこのテーブルを使用する方法がわかりません。あなたは?

4

1 に答える 1

2

これは、クロス結合を使用して実現できます。

SELECT user_id, d_date,
       COUNT(CASE WHEN messages.m_date = d.d_date then 1 end) Volume
FROM messages
CROSS JOIN datetable d
GROUP BY messages.user_id, d.d_date
ORDER BY messages.user_id, d.d_date ASC

SQLフィドルのデモ

于 2012-05-02T21:27:50.817 に答える