データを集計しようとしたとき、キーとなる列に重複した値があると、単純なSUMIFやVLOOKUPでは正しい結果が得られないことがあります。たとえば、同じ商品コードが複数回出現する売上データで、商品ごとの合計金額を求めたい場合です。このような状況では、QUERY関数を使うことで重複キーを自動的にグループ化し、正確な集計ができます。この記事では、QUERY関数を用いてキーがユニークでないデータを集計する具体的な手順を解説します。
QUERY関数は、SQLライクな構文でデータを操作できる強力な関数です。GROUP BY句を使えば、指定した列でデータをグループ化し、各グループに対してSUMやCOUNTなどの集計ができます。キーが重複している場合でも、グループ化によって自動的にまとめて集計されます。この記事を読めば、重複キーを含むデータでも正しい集計結果を得られるようになります。
【要点】QUERY関数で重複キーをグループ化して集計する方法
- =QUERY(範囲, “SELECT A, SUM(B) GROUP BY A”): 範囲内のA列をグループ化し、B列の合計を計算します。キーが重複していても自動的に1行にまとまります。
- GROUP BY句: SELECTで指定した集計列以外の非集計列は必ずGROUP BYに含める必要があります。クエリの構文に注意します。
- LABEL句: 集計結果の列見出しを変更する場合、LABEL句を使って指定します。例:LABEL SUM(B) ‘合計’
ADVERTISEMENT
目次
QUERY関数が重複キーを処理する仕組み
QUERY関数は、GoogleスプレッドシートでSQL風のクエリを実行できる関数です。SELECT句で取得する列、WHERE句でフィルタ、GROUP BY句でグループ化、ORDER BY句で並び替えなどが可能です。キーがユニークでないデータを集計する場合、GROUP BY句が重要な役割を果たします。GROUP BYを指定すると、指定した列の値ごとにデータがグループ化され、そのグループ内でSUMやAVG、COUNTなどの集計関数が適用されます。たとえば、A列に重複した商品コードがある場合、GROUP BY Aと書くことで商品コードごとに1行にまとまり、同時にB列の合計を計算します。
QUERY関数の基本構文は次のとおりです。
=QUERY(データ範囲, "SELECT 列1, 集計関数(列2) GROUP BY 列1", ヘッダー行数)
第1引数にデータ範囲、第2引数にクエリ文字列をダブルクォーテーションで囲んで指定します。第3引数にはヘッダー行数(省略可)を指定します。集計関数にはSUM、COUNT、AVERAGE、MAX、MINなどが使えます。GROUP BYはSELECT句に含まれる非集計列をすべて列挙する必要があります。集計関数の列はGROUP BYに含めてはいけません。
QUERY関数を使った重複キーの集計手順
ここでは、具体的なサンプルデータを使って手順を説明します。以下のような売上データがあるとします。
| A: 商品コード | B: 金額 |
|---|---|
| P001 | 100 |
| P002 | 200 |
| P001 | 150 |
| P003 | 300 |
| P002 | 250 |
このデータで、商品コードごとの合計金額を求めます。手順は以下のとおりです。
- 結果を表示するセルを選択する
任意のセル(例:D1)をクリックします。 - QUERY関数を入力する
次のように数式を入力します。=QUERY(A1:B5, "SELECT A, SUM(B) GROUP BY A", 1)
データ範囲はヘッダー行を含むA1:B5、クエリ文字列ではSELECT A(商品コード)とSUM(B)(金額の合計)を指定し、GROUP BY Aで商品コードごとにグループ化します。第3引数の1はヘッダー行が1行あることを意味します。 - 結果を確認する
数式を入力すると、次のように商品コードごとに1行ずつ、合計金額が表示されます。
P001: 250 (100+150)、P002: 450 (200+250)、P003: 300。
重複キー(P001やP002)が自動的にグループ化され、正しい合計が得られます。
必要に応じて、列見出しを変更したい場合はLABEL句を使います。例:=QUERY(A1:B5, "SELECT A, SUM(B) GROUP BY A LABEL SUM(B) '合計金額'", 1) とすると、SUM(B)の見出しが「合計金額」になります。
複数の集計列を同時に扱う場合
複数の集計を同時に行うことも可能です。たとえば、商品コードごとに金額の合計と平均を表示するには、SELECT句にSUM(B)とAVG(B)をカンマ区切りで指定します。
=QUERY(A1:B5, "SELECT A, SUM(B), AVG(B) GROUP BY A", 1)
結果はA列に商品コード、B列に合計、C列に平均が表示されます。
集計前にデータをフィルタする場合
WHERE句を使って、特定の条件を満たす行だけを集計対象にできます。たとえば、金額が100以上の行だけを集計するには次のようにします。
=QUERY(A1:B5, "SELECT A, SUM(B) WHERE B >= 100 GROUP BY A", 1)
WHERE句はGROUP BYの前に記述します。条件に文字列を使う場合はシングルクォーテーションで囲みます。
日付やテキストのグループ化
キーが日付の場合も同様にグループ化できます。ただし、日付はシリアル値として扱われるため、QUERY内で日付関数を使ってフォーマットを変換することも可能です。たとえば、月ごとに集計する場合は、SELECT句でMONTH(日付列)などを使います。
QUERY関数使用時の注意点とよくあるトラブル
GROUP BYに必要な列が足りない場合
SELECT句に集計関数以外の列(非集計列)を複数含める場合、それらすべてをGROUP BYに含める必要があります。たとえば、商品コードとカテゴリの2列を表示し、金額の合計を出す場合は、SELECT A, B, SUM(C) GROUP BY A, B のように、AとBの両方をGROUP BYに指定します。
データ範囲に空白行やエラー値が含まれている場合
QUERY関数はデータ範囲内に空白行があると、その行も対象となり、グループ化に影響する場合があります。集計前に空白行を除外するには、WHERE句で各列が空白でない条件を追加します。たとえば、WHERE A IS NOT NULL です。
大量のデータでパフォーマンスが低下する場合
QUERY関数は数万行以上のデータを扱うと計算が遅くなることがあります。その場合は、データ範囲を制限するか、ピボットテーブルの使用を検討します。また、QUERY内での文字列結合や複雑な条件はパフォーマンスに影響します。
QUERY関数の結果が期待した並び順にならない場合
デフォルトではグループ化したキーの昇順に並びます。降順にしたい場合はORDER BY句を使います。例:ORDER BY A DESC
ADVERTISEMENT
QUERY関数と他の集計方法の比較
| 方法 | 特徴 | キー重複時の動作 | 複数条件 |
|---|---|---|---|
| QUERY関数 | SQLライクで柔軟。複数集計・フィルタ・並び替えを一つの数式で実行できる | GROUP BYで自動グループ化 | WHERE句で簡単に指定できる |
| ピボットテーブル | 視覚的に操作可能。フィルタ・グループ化・集計をGUIで行える | 行ラベルにキーを設定すれば自動でグループ化される | フィルタ機能で条件設定可能 |
| SUMIF / SUMIFS | シンプルな条件付き集計に適する。重複キーの場合はキーごとに個別の数式が必要 | 重複を考慮せず、条件に合致するすべての行を集計するため、キーごとに数式を書く必要がある | SUMIFSで複数条件可能 |
QUERY関数は、重複キーを一つの数式でまとめてグループ化したい場合に最適です。ピボットテーブルは対話的な分析に向いており、SUMIFは単純な条件集計に便利です。状況に応じて使い分けます。
まとめ
この記事では、GoogleスプレッドシートのQUERY関数を使ってキーがユニークでないデータを集計する手順を解説しました。GROUP BY句を活用することで、重複キーを自動的にグループ化し、SUMやAVGなどの集計を正確に行えます。また、WHERE句やLABEL句を組み合わせれば、より高度な集計も可能です。
QUERY関数は学習コストが少しかかりますが、一度覚えれば多様なデータ操作を一つの数式で実現できます。特に、大量のデータを扱う際や、動的な集計が必要な場面で威力を発揮します。さらに、ピボットテーブルやSUMIFSとの併用も検討すると、より効率的なデータ分析ができるでしょう。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】数値の連続データを自動入力!オートフィルの活用
- 【Googleスプレッドシート】ダークモードを有効にする!目に優しい配色への切替
- 【Googleスプレッドシート】株価APIで株式データを自動取得!GOOGLEFINANCE超え活用
- 【Googleスプレッドシート】共有相手が編集できない時のチェック!権限と許可状態の確認
- 【Googleスプレッドシート】ページ設定で用紙サイズと向きを調整!印刷レイアウトの基本
- 【Googleスプレッドシート】Excelファイルxlsxをインポートする手順!ドラッグ&ドロップで取り込み
- 【Googleスプレッドシート】条件付き書式をコピーする!書式のみペーストの活用
