はじめに
はじめまして!
リブセンスで転職会議の営業をしている平井です。
Qiita Advent Calendarへは初参加です!
なぜ営業である私が、技術に関わる話をするこの企画に参加したかというと。。。
私達リブセンスでは営業でもSQLを書く文化があります。
しかし、私は前職がメーカーの営業だったこともあり、これまでエンジニアと話したこともなく、そんなものに全く触れてきませんでした。(はじめはクエリを見ただけで思考停止するレベルです。)
そんな私が、今回約3ヶ月間、社内のエンジニアにお願いしてSQLを勉強しました!
これを読んで少しでも営業の方が、「SQL勉強してみようかな」となればと思い参加しました!!
なぜSQLが必要だったか
そもそもなぜSQLを書く必要があるかというと、
実際の営業活動をする中で、SQLを書ける、書けないで得られる情報量や業務にかかる時間、クライアントへの提案の幅など大きく変わると感じる事が多々あったから。
実際にあったケースを紹介します。
利用シーン
- クライントの効果状況を把握し分析する場合
- 営業戦略を考えるための判断材料を集める場合
など
SQLを書けないことで困ったこと
-
どんなデータが出せて、何が出せないのか分からない
- ある日のやりとり
- クライアント
- 「効果測定のため1通目のスカウトメールから応募に至る反響率を出して欲しいんですが可能ですか?」 - 営業
- 「出せるかどうか確認します。。。」
- クライアント
- ある日のやりとり
-
依頼をするとエンジニアの時間を取ってしまうのであれもこれも頼みづらい
- ある日のやりとり
- 営業
- 「忙しいところすみません。手が空いたときでいいので年代別の応募者数とその応募経路比率を出してほしいんですけど可能ですか?特に急ぎじゃないんで。」 - エンジニア
- 「あ、大丈夫ですよ!すぐやります!」 - 営業)
- 「すみませんm(_ _)m」
- 営業
- ある日のやりとり
-
高度な分析が必要な物以外は依頼される方もする方も互いにとって効率悪い
- ある日のやりとり
- 営業A
- 「ITエンジニアの会員登録者数出してもらいたいのですが、今大丈夫ですか?」 - 営業B
- 「経理の会員登録者数出してもらいたいのですが、今大丈夫ですか?」 - 営業C
- 「営業の会員登録者数出してもらいたいのですが、今大丈夫ですか?」 - エンジニア
- 「少々お待ちを。。」
- 営業A
- ある日のやりとり
同じようなことを営業の皆さんも経験したことないでしょうか。
SQLを書けることで解決、改善できることって結構多いと思います。
学んだこと
(勉強時間:3ヶ月間で合計約36時間)
1日1時間、下記の流れで勉強しました。
- クエリの意味を理解する
- 覚えたクエリを使って「自分でテーマを考えて」データ抽出
- レビューをもらう
- 宿題として次回までにその日覚えたクエリを使って、2~3つ「自分でテーマを決めて」データ抽出
以下、習ったクエリを使って実際抽出したデータの一部
-
SELECT/FROM/WHERE
-
意味
-
SELECT
:どのカラムを表示させるか -
FROM
:どのテーブルからデータをとるか -
WHERE
:どのような条件で
-
-
実際叩いたクエリ
- 会員情報テーブルで現住所が「東京」のレコードを表示する
-
SELECT
*
FROM
会員情報テーブル
WHERE
会員情報テーブル.現住所 = '東京都'
-
DISTINCT/COUNT/LIMIT
- 意味
-
DISTINCT
:指定したカラムが重複してるレコードを除外 -
COUNT
:指定したカラムのレコード数を数える -
LIMIT
:レコードの表示数を指定する
-
- 実際叩いたクエリ
- 当月求人掲載している企業数
- 意味
SELECT
契約企業テーブル.企業名,
COUNT(DISTINCT 契約企業テーブル.ID),
契約企業テーブル.ステータス
FROM
契約企業テーブル
WHERE
契約企業テーブル.ステータス = '公開'
-
LIKE
- 意味
-
LIKE
:指定した文字列のパターンマッチングを検索する
-
- 実際叩いたクエリ
- スカウトメールの文面に「面談」を含むテンプレート
- 意味
SELECT
スカウトメールテンプレートテーブル.ID,
スカウトメールテンプレートテーブル.文面,
FROM
スカウトメールテンプレートテーブル
WHERE
BODY LIKE '%面談%'
-
GROUP BY/ORDER BY
- 意味
-
GROUP BY
:指定したカラム別にデータ表示 -
ORDER BY
:指定したカラムの「降順」「昇順」で並び替え
-
- 意味
-
INNER JOIN/OUTER JOIN
- 意味
-
INNER JOIN
:同じカラムを持つ2つのテーブルを結合 -
OUTER JOIN
:関連付けた別テーブルの2つのカラムが一致した場合結合
-
- 実際叩いたクエリ
- 地域別ユーザーからの気になる数
- 意味
SELECT
住所テーブル.名前,
COUNT(住所テーブル.名前)
FROM
求人へ気になるボタン押したユーザーのテーブル
INNER JOIN
会員情報テーブル ON 会員情報テーブル.ID = 求人へ気になるボタン押したユーザーのテーブル.会員ID
INNER JOIN
住所テーブル ON 住所テーブル.ID = 会員情報テーブル.住所ID
GROUP BY
住所テーブル.名前
ORDER BY
COUNT(住所テーブル.企業名) DESC
-
DATE_FORMAT
- 意味
-
DATE_FORMAT
:日付を様々な形式での表示に変更
-
- 実際叩いたクエリ
- 当月のユーザー気になる起点でのスカウト数
- 意味
SELECT
COUNT(*) AS ユーザー気になる起点でのスカウト数
FROM
ユーザーの気になる起点でのスカウトテーブル
WHERE
DATE_FORMAT(スカウト送信日, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m')
-
CASE
- 意味
-
CASE
:指定したカラムを指定した条件式で置換え
-
- 実際叩いたクエリ
- 年代別応募数
- 意味
SELECT
CASE WHEN 会員情報テーブル.年代 IN ('20代前半', '20代後半') THEN '20代'
WHEN 会員情報テーブル.年代 IN ('30代前半', '30代後半') THEN '30代'
WHEN 会員情報テーブル.年代 IN ('40代前半', '40代後半') THEN '40代'
WHEN 会員情報テーブル.年代 = '50代' THEN '50代'
WHEN 会員情報テーブル.年代 = '60代' THEN '60代'
WHEN 会員情報テーブル.年代 = '20歳未満' THEN '10代'
ELSE 'その他' END AS '年代',
COUNT(応募数テーブル.会員ID)
FROM
応募数テーブル
INNER JOIN
会員情報テーブル ON 会員情報テーブル.ID = 応募数テーブル.会員_ID
GROUP BY
CASE WHEN 会員情報テーブル.年代 IN ('20代前半', '20代後半') THEN '20代'
WHEN 会員情報テーブル.年代 IN ('30代前半', '30代後半') THEN '30代'
WHEN 会員情報テーブル.年代 IN ('40代前半', '40代後半') THEN '40代'
WHEN 会員情報テーブル.年代 = '50代' THEN '50代'
WHEN 会員情報テーブル.年代 = '60代' THEN '60代'
WHEN 会員情報テーブル.年代 = '20歳未満' THEN '10代'
ELSE 'その他' END
-
サブクエリ
- これから勉強します!
3ヶ月でどうなったか
自分でSQLを書けるようになったことで、先述した困ったシーンは自分で解決できるまでなりました。
日々の業務の中で、他の営業メンバーが出したいデータも、エンジニアの時間を取らずに私が対応できるようになりました。
また、私がSQLを勉強している姿を見て、社内の営業メンバーが「自分も勉強したい!」と志願してきました。先月から私がその方にSQLを教えています!
今後も営業への普及活動を続けていきます。
さいごに
定量的な分析ができることで、今やるべきことが明確になり、人にも伝わりやすくなると思います。
SQLで出す情報は営業としても、当たり前に分かっていないといけないことも多く、誰でもみれる環境を今後整えていく必要性をすごく感じました。
最後に、忙しい業務の中、SQLを根気強く教えてくれた@masahixixiさん本当にありがとうございました!!