【プログラム】SQLで特定の範囲ごとの件数取得
お疲れ様です。
すっかり途絶えていたブログの更新ですが、重い腰を上げて再開していこうと思います。
お久しぶりでございます。今日も元気です
さて、今回は少し技術的な話を…
現在プログラマとして、PHPやSQLというものを専門的に使い業務をしているのですが
これがなかなかに厄介な物が多く、解決したので覚え書き程度に残させていただきます。
特にピンとこないし、興味もないよという方は
www.youtube.com
かわいい猫の映像でもご覧ください。
<要求>
特定の期間での全体ユーザーの課金ログから、課金額を合計し
その額ごとに件数を調べて欲しい
さて、早速解いていきましょう
結果的に2つのとき方を考えました。
パターンA
SELECT '1~1000' AS '範囲' ,COUNT(*) AS '件数' FROM (SELECT SUM(課金額) num ,user_id FROM テーブル名 WHERE create_time BETWEEN 'はじめの時間' AND '終わりの時間' GROUP BY user_id ) a WHERE a.num BETWEEN 1 AND 1000 UNION ~
パターンB
SELECT COUNT(CASE WHEN a.num BETWEEN 1 AND 1001 THEN 1 ELSE null END) '1~1001', FROM (SELECT SUM(課金額)num FROM テーブル名 WHERE create_time BETWEEN 'はじめの時間' AND '終わりの時間' GROUP BY user_id)a
(コードのインデントとかブログ上で整えるの難しいですね…)
この2つを比較するとデータの件数にもよりますが
パターンAの場合が30秒ほど
パターンBの場合が10秒未満でデータを取得することが出来ました。
もう少しすっきりした書き方も出来そうなものですが、とりあえず今の自分での実力では
ここが限界のようです…!
自分が使ったパターンBの方の解説↓
CASE文を使い、指定の範囲内の場合には、1を返す
帰ってきた1の値の件数をカウントするという手法をとりました。件数に当てはまらない場合には必ず「null」にするようにしないと、件数が無駄に増えてしまいます。