英姿颯爽

日々の気づきや、技術的なお話です。

【プログラム】SQLで特定の範囲ごとの件数取得

お疲れ様です。
すっかり途絶えていたブログの更新ですが、重い腰を上げて再開していこうと思います。

お久しぶりでございます。今日も元気です



さて、今回は少し技術的な話を…
現在プログラマとして、PHPSQLというものを専門的に使い業務をしているのですが
これがなかなかに厄介な物が多く、解決したので覚え書き程度に残させていただきます。

特にピンとこないし、興味もないよという方は
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」にするようにしないと、件数が無駄に増えてしまいます。