[SQL]GROUPでCOUNTした値を元にGROUPしてCOUNTする方法

タイトルだけみるとなんのこっちゃですね。


SELECT COUNT(user_id) FROM play_log GROUP BY user_id


といったGROUPで別けてCOUNTする方法はよく知られているかと思いますが、ここでとってきたCOUNTの値を元にGROUPで別けてCOUNTする仕事が出てきたのでちょっと悩みました。

私の例では、一回ゲームをするたびINSERTされるログから、X回ゲームをプレイするユーザーがY人いる、といった分布を作るものでした。

■■キーワード■■
・副問い合わせ


冒頭と重複しますが、


SELECT COUNT(user_id) FROM play_log GROUP BY user_id


これでユーザーごとにグルーピングしてゲームのプレイ回数を、ユーザー数分だけ取得することができます。ここで得られた結果レコードをテーブルとして扱ってしまい、副問い合わせとしてSQL文を組み立てます。
イメージとしては下記のような感じです。

SELECT X,COUNT(X) AS Y FROM [結果レコード] GROUP BY X


上記の[結果レコード]の中身を副問い合わせにすればOKです。


SELECT X,COUNT(X) AS Y FROM (
SELECT COUNT(user_id) AS X FROM play_log GROUP BY user_id
) AS X_TABLE
GROUP BY X


ヴィジュアル的に説明できていないのでわかりづらいかもしれませんが、上記SQLで、X回ゲームしたユーザーがY人という分布表の結果レコードが得られます。
以上、今日の覚書でした。

このブログ記事について

このページは、tatsuyaが2011年6月29日 00:43に書いたブログ記事です。

ひとつ前のブログ記事は「[SQL]条件を指定してCOUNTする方法」です。

次のブログ記事は「[SQL]UPDATEかもしれないしINSERTかもしれない場合のREPLACE」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。