2011年6月アーカイブ

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


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人という分布表の結果レコードが得られます。
以上、今日の覚書でした。

[SQL]条件を指定してCOUNTする方法

エクセルでいうCOUNTIF()みたいな関数ってSQLでないの?と探しておりましたらありました。

■■キーワード■■
・SUM
・CASE


COUNTしたい訳なんですがSUM()をつかます。SUMの中の条件指定としてCASEを使います。


例:アクセスログの中で男性ユーザーのログインだけをカウント

SELECT SUM(CASE WHEN sex = 'male' THEN 1 ELSE 0 END) from access_log


sexカラムの値が男性のときは1を、それ以外は0として判定し(CASE文)、
それぞれをSUM()で合計することで条件を指定して、エクセルのCOUNTIF()と同じ結果を得られます。

以上、覚書程度にブログを更新していこうと思いますのでよろしくお願いします。

このアーカイブについて

このページには、2011年6月に書かれたブログ記事が新しい順に公開されています。

次のアーカイブは2011年8月です。

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