Google スプレッドシートの COUNTIFS 関数で OR 条件を扱う
Google スプレッドシートの COUNTIFS 関数で、OR 条件を扱う方法について、備忘録を兼ねて整理します。
結論として、以下の記法により、実現することができます。
=COUNTIFS(MAP(列1, 列2, LAMBDA(a, b, OR(aを使って記述された列1に求める条件, bを使って記述された列2に求める条件))), TRUE)
詳細
公式ドキュメントより、COUNTIFS 関数は以下のように利用します。
=COUNTIFS(条件範囲1, 条件1, [条件範囲2, 条件2, ...])
条件範囲1 - 条件1 に対して検証する範囲です。
条件1 - 条件範囲1 に適用するパターンまたはテストです。
条件範囲2, 条件2... - [省略可] - 検証対象となる追加の範囲と条件です(反復可)。
すなわち、COUNTIFS で扱う複数の条件は AND 条件であることが前提となっています。
これを OR 条件を扱うことができるように拡張するには、MAP 関数と LAMBDA 関数を組み合わせます。LAMBDA 関数で OR 条件で判定したい条件式を定義して、MAP 関数でこれを特定の範囲に適用します。MAP 関数の結果は特定の範囲に対して条件式を適用した TRUE/FALSE の配列になるため、この配列に対して TRUE を数え上げれば OR 条件を満たす項目の数をカウントすることができます。
具体例
以下のサンプルデータを用いて、具体的な例を見てみます。このデータは、飲食店についてそのエリアとジャンル、予算をまとめたデータを想定したものです。
新宿区の飲食店をカウントしたい場合は、以下の式で求めることができます。
=COUNTIFS(data!A2:A6, "新宿区")
新宿区かつ予算が 4,000 円以内の飲食店をカウントしたい場合は、以下の式で求めることができます。
=COUNTIFS(data!A2:A6, "新宿区", data!C2:C6, "<=4000")
新宿区または予算が 4,000 円以内の飲食店をカウントしたい場合は、以下の式で求めることができます。
=COUNTIFS(MAP(data!A2:A6, data!C2:C6, LAMBDA(a, b, OR(a="新宿区", b<=4000))), TRUE)
新宿区または予算が 4,000 円以内のうち、イタリアンの飲食店をカウントしたい場合は、以下の式で求めることができます。
=COUNTIFS(MAP(data!A2:A6, data!C2:C6, LAMBDA(a, b, OR(a="新宿区", b<=4000))), TRUE, data!B2:B6, "イタリアン")
このように、設定した OR 条件は COUNTIFS 関数の中に自然に組み込めるため、さらに他の条件と AND をとるなど、柔軟に条件に応じた項目数をカウントすることができます。
最後に
Google スプレッドシートは他のメンバーに具体データを共有しながら、データを集計したりその過程を共有したりすることができる強力なツールなので重宝しています。
実際には OR 条件の表現は新しくデータ列を追加すれば実現できるのですが、関数のみで実現したいシチュエーションがあったため、解決策を考えるとともにメモとして残しました。
Discussion