PHP 中級 講座

第16回 テーブル定義の変更と応用練習 (その4)

都道府県人口比別顧客数ランキング

  • じゃ太郎君が前回やりたかったことができる準備は整ったから、レポート作ってみてね。都道府県別会員数を絶対数ではなく人口比でランキングするってやつだったよね。
  • はい。やっていたことを簡単におさらいします:

やっていたのは「顧客テーブルの登録件数を都道府県ごとにカウントして、多い順に出す」というものでした。

mysql> SELECT c.prefecture_code, p.name, COUNT(*) count
    ->   FROM customers c, prefecture p
    ->  WHERE c.prefecture_code = p.code
    ->  GROUP BY c.prefecture_code
    ->  ORDER BY count DESC
    ->  LIMIT 5;
+-----------------+----------+-------+
| prefecture_code | name     | count |
+-----------------+----------+-------+
| 13              | 東京都   | 10279 |
| 12              | 千葉県   |  7336 |
| 14              | 神奈川県 |  5011 |
| 11              | 埼玉県   |  4304 |
| 44              | 大分県   |  4257 |
+-----------------+----------+-------+
5 rows in set (0.36 sec)
  • 僕は、東京が多いのは人口が多いせいだろうと考え、人口に応じた評価をしないと不公平だろうと(笑)思い、「顧客数が人口に占める割合」でランキングを出してみようと考えました。ということで、やっと都道府県ごとの人口データができたので、これを使って挑戦してみます!

こんなSQLを考えてみました。どうですか、先輩。

 SELECT c.prefecture_code, p.name, COUNT(*) count,
        p.population, count(*)/population*100 jinkouhi
   FROM customers c, prefecture p
  WHERE c.prefecture_code = p.code
  GROUP BY c.prefecture_code
  ORDER BY jinkouhi DESC;
  • お。いろいろなカラムを出力するようにしたんだね。面白いね。(読者のみなさんも、どんな結果が表示されるのか、このSQLを見て想像してみてください)
  • では実行してみます。
mysql>  SELECT c.prefecture_code, p.name, COUNT(*) count,
               p.population, count(*)/population*100 jinkouhi
    ->    FROM customers c, prefecture p
    ->   WHERE c.prefecture_code = p.code
    ->   GROUP BY c.prefecture_code
    ->   ORDER BY jinkouhi DESC;
+-----------------+----------+-------+------------+----------+
| prefecture_code | name     | count | population | jinkouhi |
+-----------------+----------+-------+------------+----------+
| 44              | 大分県   |  4257 |    1203000 |   0.3539 |
| 31              | 鳥取県   |   790 |     600000 |   0.1317 |
| 12              | 千葉県   |  7336 |    6098000 |   0.1203 |
: (略)            :          :       :            :          :
| 01              | 北海道   |   721 |    5570000 |   0.0129 |
| 23              | 愛知県   |   731 |    7360000 |   0.0099 |
+-----------------+----------+-------+------------+----------+
47 rows in set (0.38 sec)

>> 結果全体はこちら

  • うわ。見るんじゃなかった。。。
  • どうしたんだい?
  • 僕、ちゃんと 100を掛けてパーセンテージを出していますよね、、こんなに少ないんだぁ(嘆息)。人口の1%もいないんですね、どの県も。
  • たとえば日本の人口を 130,000,000人だとして1%ってのは顧客130万人に相当するだろう? うちの顧客数(customersテーブルに登録されている数)が 7万足らずだから、人口比 0.05% くらいっていうのは妥当なんじゃないかな。
  • なるほど、そうやって考えてみると僕が過大な期待をしていたことがよくわかりますね。それにしても、大分って人口に対してすっごくお客さんが多いですね、他の県に比べて。
  • なんだろう。こうやってみると桁違いだね。クチコミしてくださるいいお客さんがいるのか、うちの営業の努力か。こういう情報、営業や戦略の現場でも持っていないことも多いから、自分の部署以外にもお友達をいっぱいつくって、雑談で教えてあげたいね。
  • 雑談なんですか?
  • まずは雑談でいいだろう? 何を読み取れるかもわからないような提携レポートをいきなり業務として定めて定式化するのはナンセンスだからね。

それに業務のレポートを作るには本質ではない部分に体力を使ったりした経験ないかい? 形式的な作業として例えば整形しなきゃいけなかったり、何度も見直すことにすごい時間がかかってしまったり。でもこうやって今出したような数字を、適切な人が知らないままってのは勿体ない。

こんな数字出たんだけど、って軽くお話しできるレベルでの情報流通って言うのは会社の中には絶対に欲しいところだね。 昨今どの会社でもこういうつながりが薄くなってきているけど。

  • 肝に銘じておきます! 知ってることどんどん言おうよってことですね!
  • その通り。期待しているよ。

それじゃ次回は最終回として、今までお話しから漏れてしまったようなちょっとした小技とかを話すことにしようか。

おわりに

サカイ先生
どうでしたか。ちょっと分量が多くてクラクラしてしまったでしょうか。今回の内容の本質は冒頭で先輩が説明していた5ステップですので、よくわからなくなってしまった方は各ステップの本質はなにかを考えてみてください。きっと理解できると思います。

さて次回はいよいよ最終回です。実際に業務の現場で MySQL を触る際にちょっと知っておいたほうがよさそうなことなど、様々な情報をアラカルトでお伝えしようと思います。次回もお楽しみに!

第17回 その他のちょっとしたテクニック」へ

今回の「サカイ先生のMySQL講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

「サカイ先生のMySQL講座」のトップへ