【スプレッドシートで使えるSQL関数】
今日はコードの紹介ではなく関数の紹介をしていきます
前回紹介しましたがGoogleスプレッドシートでSQLのような関数を使うには、Googleが提供する「QUERY関数」を使いますね。
基本構文のおさらいですが、
=QUERY(範囲, "SQL文", ヘッダー行の数)
例:A1からD100の範囲で、B列が「りんご」の行を取り出したい場合、次のように書きます。
=QUERY(A1:D100, "SELECT * WHERE B = 'りんご'", 1)
とこのようになります
続けてよく使うSQL風関数の例を紹介します。
1. SELECT(列を選択)
=QUERY(A1:D100, "SELECT A, C", 1)
2. WHERE(条件指定)
=QUERY(A1:D100, "SELECT * WHERE C > 1000", 1)
3. ORDER BY(並び替え)
=QUERY(A1:D100, "SELECT * ORDER BY D DESC", 1)
4. LIMIT(上位〇件)
=QUERY(A1:D100, "SELECT * LIMIT 5", 1)
5. LABEL(列名の表示変更)
=QUERY(A1:D100, "SELECT A, B LABEL A '商品名', B '価格'", 1)
6. GROUP BY(グループ集計)とSUM(合計)
=QUERY(A1:D100, "SELECT B, SUM(C) GROUP BY B", 1)
7. COUNT(件数)
=QUERY(A1:D100, "SELECT B, COUNT(C) GROUP BY B", 1)
8. AVG(平均)
=QUERY(A1:D100, "SELECT B, AVG(C) GROUP BY B", 1)
例外で一つ
これは本来のSQLではないのですがスプレットシートのSQLライクで使える関数です
PIVOT:行→列の変換(ピボットテーブル)
使用例
=QUERY(A1:D5, "SELECT B, SUM(C) PIVOT A")このクエリの意味:
B= 商品SUM(C)= 個数の合計PIVOT A= 日付ごとに列を分けて表示
実行結果:
| 商品 | 2024/07/01 | 2024/07/02 |
|---|---|---|
| りんご | 3 | 1 |
| みかん | 2 | |
| バナナ | 5 |
これがPIVOTです!ぜひ活用してみてください〜
【まとめ】
SQLのコードを学ぶのも良いですが、シートとSQLでどう違うのか?を差別化して長所を生かして使い分けるのが大事です!
今回のように半ば無理やり数式理解していなくても動かすことができるのは頭の片隅に覚えておけばいつか役に立ちます〜
【スプレットシートでSQLを使う】
今回は、GoogleスプレッドシートでSQLを使う方法を紹介します!
スプレッドシート上でも、SQLのコードを使うことができます。ただ本当のSQLではなくクエリ関数を使います。
下記のようなデータがスプレットシートにあったとします
| A(id) | B(category) | C(created_at) | D(price) |
| 1 | 食品 | 2024/07/16 00:23:01 | 500 |
| 2 | 衣類 | 2024/07/16 00:45:32 | 1500 |
| 3 | 家電 | 2024/07/16 01:05:10 | 8000 |
| 4 | 食品 | 2024/07/16 01:30:00 | 600 |
| 5 | 衣類 | 2024/07/16 02:10:17 | 2500 |
| 6 | 食品 | 2024/07/16 02:55:55 | 550 |
| 7 | 家電 | 2024/07/16 02:12:08 | 12000 |
次に、作業列としてE列に「時間帯」を追加します。C列(created_at)から「00:00」「01:00」などを取り出します。
E2セルに次のように入力してE列にオートフィルします
=TEXT(C2, "HH:00")
このE列(時間帯)を使って、カテゴリごとの件数と合計金額を時間帯別に集計していきます。
件数をSQLのように集計するには、次のようにQUERY関数を使います:
=QUERY(A1:E8, "SELECT E, COUNT(B) GROUP BY E PIVOT B")
実行結果は次のようになり、数式を打ったセルの下に反映されるはずです
| 時間帯(E) | 家電 | 衣類 | 食品 |
| 00:00 | 1 | 1 | |
| 01:00 | 1 | 1 | |
| 02:00 | 1 | 1 | 1 |
QUERY関数の使い方は、
=QUERY(テーブル範囲, "SQLコード”, (数字) )
最後の数字はヘッダーと言われます。省略も可能なので特に理解しなくても使う分には問題ないです。
【まとめ】
スプレットシートでSQLコードを使えればfunction関数のコードを別で覚える前でもSQLコードで抽出することができます!
【カテゴリを時間別で表示する】
今回は「カテゴリ × 時間帯」のクロス集計を行うSQLを紹介します!
レポートやダッシュボードでは、カテゴリごとの時間帯別の傾向を見たいことがありますよね。
今回は SQL だけでピボット的に「カテゴリごとの件数を横並び」で集計し、さらに全体の件数も別枠で表示する方法を解説します。
↓元データ↓
| id | category | created_at |
|---|---|---|
| 1 | 食品 | 2024-07-16 00:23:01 |
| 2 | 衣類 | 2024-07-16 00:45:32 |
| 3 | 家電 | 2024-07-16 01:05:10 |
| 4 | 食品 | 2024-07-16 01:30:00 |
| 5 | 衣類 | 2024-07-16 02:10:17 |
| 6 | 食品 | 2024-07-16 02:55:55 |
| 7 | 家電 | 2024-07-16 02:12:08 |
| 8 | 家電 | 2024-07-16 02:40:10 |
時間帯ごとにカテゴリ別の件数を横に並べて表示
全体の総件数を別クエリで取得
↓SQL↓
SELECT DATE_FORMAT(created_at, '%H:00') AS hour, COUNT(CASE WHEN category = '食品' THEN 1 END) AS '食品', COUNT(CASE WHEN category = '衣類' THEN 1 END) AS '衣類', COUNT(CASE WHEN category = '家電' THEN 1 END) AS '家電', COUNT(*) AS count_all FROM logs GROUP BY hour_label ORDER BY hour_label; SELECT COUNT(*) AS total_count FROM logs;
↓実行例↓
| hour | 食品 | 衣類 | 家電 | count_all |
|---|---|---|---|---|
| 00:00 | 1 | 1 | 0 | 2 |
| 01:00 | 1 | 0 | 1 | 2 |
| 02:00 | 1 | 1 | 2 | 4 |
| total_count |
|---|
| 8 |
【解説】
DATE_FORMAT(created_at, '%H:00'):時間部分をラベル形式に変換
COUNT(CASE WHEN category = ...):カテゴリ別に件数をカウント
COUNT(*):その時間帯の全体件数
総件数は SELECT COUNT(*) を別で実行
【まとめ】
時間帯別にカテゴリの傾向が見やすくなります
ピボット風に並べることで、視覚的に把握しやすいです
総件数を別表示すれば、比率・割合の計算にも便利ですね
【時間別と全体を同時に表示する】
今回は前回の続きとして、「時間帯別のカテゴリ件数と、全体の総件数を別々に表示する方法」を解説します!
実務でも、「時間帯ごとの傾向」と「全体の件数」を同じレポートに載せたいけれど、同じ表に混ぜずに別々の枠で見たい、というケースはよくあります。
今回は以下のように分けて取得する例を紹介します:
①時間帯ごとのカテゴリ別件数と全体件数
②全データの総件数(別で表示用)
↓SQL↓
SELECT DATE_FORMAT(created_at, '%H:00') AS hour_label, COUNT(CASE WHEN category = '食品' THEN 1 END) AS count_shokuhin, COUNT(CASE WHEN category = '衣類' THEN 1 END) AS count_irui, COUNT(*) AS count_all FROM logs GROUP BY hour_label ORDER BY hour_label;
SELECT COUNT(*) AS total_count FROM logs;
このクエリでは時間帯ごとに:
食品カテゴリの件数
衣類カテゴリの件数
時間帯ごとの全件数
を横並びで表示します。
↓結果例↓
| hour_label | count_shokuhin | count_irui | count_all |
| 00:00 | 5 | 3 | 12 |
| 01:00 | 2 | 4 | 10 |
| 02:00 | 1 | 2 | 8 |
| 150 |
【解説】
DATE_FORMAT(created_at, '%H:00') → 「00:00」「01:00」などの時間帯ラベルを生成します
CASE WHEN を使ってカテゴリごとの件数を同時に集計します
COUNT(*) でその時間帯の全カテゴリ合計件数です
このクエリでは全体の総件数だけをシンプルに1行で取得します。
【まとめ】
実際に抽出する時に使うように時間別の件数と総件数を同時に表示することができますね!
フォーマットをコピーしておいて一つにまとめておくと使いやすいですね。
次回はクロス集計について書いていきます〜
【時間表示しながら条件をつける】
今回は前回の応用として、「カテゴリ別に時間帯ごとの件数・全体件数・総件数を同時に表示する方法」を解説します!
時間帯分析に加えて、カテゴリで絞り込みや比較をしたい場面も多いですよね。
今回紹介するクエリでは、以下の3つを同時に取得します:
①指定カテゴリの時間別件数
②全体の時間別件数
③全データの総件数(参考用)
※使用するテーブルは logs とし、カテゴリは category カラム、日時は created_at カラムとします。
↓SQL↓
SELECT DATE_FORMAT(created_at, '%H:00') AS hour_label, COUNT(CASE WHEN category = '食品' THEN 1 END) AS count_shokuhin, COUNT(*) AS count_all, (SELECT COUNT(*) FROM logs) AS total_count FROM logs GROUP BY hour_label ORDER BY hour_label;
【解説】
DATE_FORMAT(..., '%H:00') で時間帯をラベルに
COUNT(CASE WHEN category = '食品' THEN 1 END) でカテゴリ「食品」の件数だけカウント
COUNT(*) は時間帯ごとの全件数
(SELECT COUNT(*) FROM logs) は全体の総件数を毎行に表示
↓結果例↓
| hour_label | count_shokuhin | count_all | total_count |
| 00:00 | 5 | 12 | 150 |
| 01:00 | 2 | 10 | 150 |
| 02:00 | 1 | 8 | 150 |
【まとめ】
HOUR()やDATE_FORMAT()で時間帯を抽出できる
GROUP BYと組み合わせて、時間帯別に集計可能
CASE WHEN でカテゴリごとの集計を同時に実現
サブクエリで総件数も出力でき、比較がしやすくなる
時間帯×カテゴリという観点から、ログや売上の傾向が見やすくなります!
【時間ごとに表示する】
今回は前回の続きとして、「時間帯別に集計して表にする方法」を解説します!
ログや売上データを分析するとき、「何時ごとの件数」「時間帯別の合計」などを出したい場面はとても多いです。
SQLでは、日時型から時間部分を取り出してグループ化することで、こうした時間帯分析が可能になります。
ただ今日のコードはmySQLでのコードになるのでご注意ください!
・日時型のカラムから「時間」を抜き出す
・GROUP BYでその時間ごとに集計する
↓mySQL↓
SELECT
HOUR(created_at) AS hour_slot,
COUNT(*) AS count_logs
FROM logs
GROUP BY hour_slot
ORDER BY hour_slot;
↓結果例↓
| hour_slot | count_logs |
| 0 | 12 |
| 1 | 5 |
| 2 | 3 |
| ... | ... |
| 23 | 8 |
→「0時台に12件」「1時台に5件」など、時間帯ごとの件数が一目で分かります。
【解説】
・HOUR()はDATETIME型の「時」部分を整数で返す関数
・MINUTE(), SECOND()も同様に使える
・GROUP BYと組み合わせることで時間帯別集計ができる
↓DATE_FORMATを使った応用例↓
SELECT
DATE_FORMAT(created_at, '%H:00') AS hour_label,
COUNT(*) AS count_logs
FROM logs
GROUP BY hour_label
ORDER BY hour_label;
・'%H:00'形式の文字列にして「00:00」「01:00」などのラベルを生成
・レポートや帳票出力にそのまま使いやすい形に
↓結果例↓
| hour_label | count_logs |
| 00:00 | 12 |
| 01:00 | 5 |
| 02:00 | 3 |
【まとめ】
・HOUR()やDATE_FORMAT()を使うことで日時型から時間帯を抽出可能です
・GROUP BYで集計すると時間帯別分析が簡単に
・ログ件数、売上件数、アクセス数など、様々な時系列データ分析で役立つ
・フォーマットを工夫するとレポート出力にもそのまま使える
次回はこれを応用して表にしつつ色々な条件でまとめてみましょう〜