【BigQuery×SQL】ピボットテーブルと同じ集計をする方法【GROUP BY句】

「全体の売上合計は出せたけど、商品ごとの数字が知りたい
都道府県別に、顧客が何人いるかパッと一覧にしたい」

Excelで大量のデータを相手に、ピボットテーブルを組んだり、何百個ものセルにSUMIF関数をコピーしたりする作業に時間を取られていませんか?

データが増えるほどExcelは重くなり、少しの操作ミスで集計がズレてしまう怖さもありますよね。

この記事で紹介する GROUP BY(グループ・バイ) を学べば、どんなに膨大なデータでも、指定した項目ごとに「数秒」で集計を完了させることができます。

学習をスムーズに進めるために

本サイトでは、実務での再現性を高めるため、全ての記事で共通のサンプルデータを使用しています。

自分のBigQuery環境で実際に手を動かしながら学ぶと、習得スピードが格段に上がります。

まずはサンプルデータ取込手順を参考に、準備を済ませておきましょう!

1. GROUP BY句とは

GROUP BYは、一言で言うと「同じ種類ごとに箱分けして、集計する」ための命令です。

前回の記事では「テーブル全体の合計(1つの数字)」を出す方法を学びましたが、実務の報告では「カテゴリーごとの売上」や「日別の平均」といった内訳を求められることがほとんどです。

・商品ごとの総販売数 ・月別の売上推移 ・地域別の顧客リスト作成

バラバラに並んだ数万行のデータを、あなたが指定した項目(切り口)ごとに一瞬で整理整頓してくれる、事務作業における「最強の時短ツール」と言えます。

一度マスターすれば、手作業でフィルタをかけて計算する手間から解放されます。

2.基本的な書き方

書き方は、いつものSELECT文の最後に一行加えるだけです。

SELECT
 グループ化したい列名,
 集計関数(計算したい列名)
FROM
 `プロジェクト名.データセット名.テーブル名`;
GROUP BY
 グループ化したい列名;
FROMで指定したテーブル(データ保管場所)から、グループ化したい項目 ごとに、計算したい列 を集計して見せてください

SELECT(見せろ)とGROUP BY(まとめろ)の横に書く名前(グループ化したい列名)を一致させるのが、最大のルールです。

3. サンプルデータによる実践

今回は、注文データが蓄積されている sales(売上データ)を使って、商品ごとの実績を出してみましょう。

【使用するテーブル:sales(全データ)】

3-1.商品ごとに「購入合計数」を算出してみる

「どの商品が、合計で何個売れたのか?」を、商品ID(product_id)ごとに集計してみます。

SELECT
 product_id AS `商品ID`,
 SUM(quantity) AS `売上合計個数`
FROM
 `test.sales`
GROUP BY
 product_id;

ここでは、「product_id(列)」を基準にして、同じIDを持つ行を一つにまとめ、その中にある「quantity(列)」を足し合わせています。

3-2.実行結果

この実行結果は、バラバラだった売上データが商品ごとに集約され、どの商品がどれだけ売れたのかが一目で分かるようになりました。

3-3.視覚化(図解フロー)

関数が裏側でどのようにデータを処理しているのか、イメージを確認しましょう。

GROUP BYで指定した列(今回は、product_id)を「仕分け用の箱(グループ)」と捉え、同じID(product_id)を持つ行をその箱(グループ)の中に次々と放り込んでいく様子を表現しています。

このように、GROUP BYを使うと、数千行あるデータも「箱(グループ)の数」と同じ行数までギュッと凝縮されます。

4. つまずきポイント・注意点

GROUP BYを使い始めると、誰もが一度はエラーに遭遇します。

4-1.初心者がハマる「SELECTとGROUP BYの不一致」の罠

注意

SELECTのすぐ後ろに書いた「箱化(グループ化)したい列名」は、必ずGROUP BYの後にも全く同じように書かなければなりません。

解決策として、「SELECTに書いた列名が、GROUP BYにも漏れなく書かれているか?」を指差し確認しましょう。

片方にしかない項目があると、BigQueryは「どう箱(グループ)を準備すれば良いのか分からない!」とエラーを返します。

5. 実務で役立つ「+α」の使い方

集計とセットでよく使うのが、並び替えの命令です。

箱(グループ)ごとに、売上個数が算出したら、そのデータをさらに、売れている順に並べ変えてみましょう。

ポイント

・どの箱(グループ)の数値が一番大きいかを知りたい時は、GROUP BYの後に、ORDER BY(オーダー・バイ)句を付け加えます。

・並び替えたい列名の後に「DESC(降順)」を指定することで、数字大きい順に並び替えることができます

SELECT
 product_id,
 SUM(quantity) AS total_qty
FROM
 `test.sales`
GROUP BY
 product_id
ORDER BY
 total_qty DESC; -- 多い順に並べる

これで、「売れ筋ランキング」の完成です。

Excelでソートボタンを押す手間すら不要になりますね!

6. まとめ・復習

お疲れさまでした!いかがでしたでしょうか?

GROUP BYを利用し、全体の数字だけでなく「内訳」が出せるようになると、SQLが急に「実務で使える強力な武器」に感じられたのではないでしょうか。

記事を通して、大量のデータを自分の思い通りに整理できる感覚を掴んでいただけたら嬉しいです。

チェック

・GROUP BY は、指定した列の同じ値を持つ行を「一つの箱」にまとめる。

・SELECTに書いた項目(集計関数以外)は、必ず GROUP BYの後にも書く。

・集計関数(SUMなど)と組み合わせることで、「項目ごとの合計」が手に入る。

これで、あなたも「商品別」「地域別」といった、ビジネスで最も求められる集計レポートを自力で作れるようになりました!

「文法はわかった。でも、実務でミスをするのがまだ怖い……」という方へ
➡ 【独学の限界?】SQL学習で「あと一歩」が進まない時の処方箋

目次

用語辞典