ADVERTISEMENT

【Googleスプレッドシート】キーがユニークでないデータの集計手順!QUERY関数を使った対応

【Googleスプレッドシート】キーがユニークでないデータの集計手順!QUERY関数を使った対応
🛡️ 超解決

データを集計しようとしたとき、キーとなる列に重複した値があると、単純な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

このデータで、商品コードごとの合計金額を求めます。手順は以下のとおりです。

  1. 結果を表示するセルを選択する
    任意のセル(例:D1)をクリックします。
  2. QUERY関数を入力する
    次のように数式を入力します。
    =QUERY(A1:B5, "SELECT A, SUM(B) GROUP BY A", 1)
    データ範囲はヘッダー行を含むA1:B5、クエリ文字列ではSELECT A(商品コード)とSUM(B)(金額の合計)を指定し、GROUP BY Aで商品コードごとにグループ化します。第3引数の1はヘッダー行が1行あることを意味します。
  3. 結果を確認する
    数式を入力すると、次のように商品コードごとに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

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。