メニュー操作で作成するピボットテーブルも便利ですが、こちらの方法でも手軽に作れます。
- PIVOT句を使うことで、横方向の集計軸を設けて集計することができます。
- GROUP BY句とPIVOT句を併用することで一般的なピボットテーブル(クロス集計表)を作成することができます。
手順
単純な例
QUERY関数を使ったピボットテーブル(クロス集計表)の例です。
B~D列には店舗別・部門別の売上が記録されています。
これに対しF2セルに次のような式を入力するだけで、店舗別(縦軸)・部門別(横軸)の売上合計を出力するピボットテーブルができています。
F2セル
=QUERY(B2:D12,"SELECT B,SUM(D) GROUP BY B PIVOT C",1)
「SELECT ~ SUM(D)」により売上を集計するよう指定し、さらに「GROUP BY B」により縦軸とする列(店舗)と、「PIVOT C」により横軸にする列(部門)を指定しています。
慣れないとSELECTの直後に「B」が必要で「C」が不要なところが気になるかもしれません。
ちなみに、こちらはPIVOTなしでGROUP BYだけを用いた集計です。
縦軸(店舗)を集計軸として売上が集計されるのがわかります。
F2セル
=QUERY(B2:D12,"SELECT B,SUM(D) GROUP BY B",1)
こちらはGROUP BYなしでPIVOTだけを用いた集計です。
横軸(部門)を集計軸として売上が集計されています。
これらの機能を組み合わせた結果として上記のようなピボットテーブルになっていることがわかります。
F2セル
=QUERY(B2:D12,"SELECT SUM(D) PIVOT C",1)
ところで、それぞれの軸に表示される項目は昇順での表示となります。縦軸の項目の降順での並べ替えは、PIVOTの後にORDER BY ~ DESCを置くことで可能です。
しかし横軸については適当な方法がなく、QUERY関数内では解決できない模様です。
F2セル
=QUERY(B2:D12,"SELECT B,SUM(D) GROUP BY B PIVOT C ORDER BY B DESC",1)
列数が増えた例
さて、こちらのデータではB~E列に店舗別・部門別・月別の売上が記録されています。
また、G2セルに入力した式により、店舗別部門別(縦軸)・月別(横軸)の売上を表示するピボットテーブルを表示しています。
G2セル
=QUERY(B2:E12,"SELECT B,C,SUM(E) GROUP BY B,C PIVOT D",1)
「GROUP BY B,C」により、店舗と部門の2つの項目を縦軸とする集計を行っています。
なお、店舗・部門・月の組み合わせごとにデータが1つずつしかないので、ここではSUM関数の代わりにMAXやMINでも同じ結果になります。ただし「SELECT B,C,E」としてしまってはダメで、適当な集計関数を使う必要があります。
さらにこちらでは、店舗別(縦軸)・月別部門別(横軸)の売上を表示しています。
G2セル
=QUERY(B2:E12,"SELECT B,SUM(E) GROUP BY B PIVOT D,C",1)
「PIVOT D,C」により、月と部門の2つの項目を横軸とする集計を行っています。
ただし見出しが2行になることはなく、1つの行にまとめて表示されます。
アンピボットについて
縦持ちデータへの変換について、次の記事で単純な例を紹介しています。