問題点
A | B | |
---|---|---|
1 | 商品名 | 売上 |
2 | 商品A | 100 |
3 | 商品B | 200 |
4 | 商品C | 150 |
5 | 商品A | 120 |
6 | 商品B | 180 |
上記のようなスプレッドシート(実際はもっと大きな行数のデータ)で
- 商品A
- 商品B
の売上だけを合計したい場合、皆さんはどのように集計するでしょうか?
sumif関数ではor条件が使えず、ネットで探してもサクッと解決策が見つからなかったのでこちらにメモします。
解決策1 : sumif関数を2つ書く
具体的には以下になります。
A | B | |
---|---|---|
1 | 商品名 | 売上 |
2 | 商品A | 100 |
3 | 商品B | 200 |
4 | 商品C | 150 |
5 | 商品A | 120 |
6 | 商品B | 180 |
=sumif(A:A,"商品A",B:B) + sumif(A:A,"商品B",B:B)
メリット :
- 単純
デメリット:
- 対象の商品が多くなると関数が長くなり、わかりにくくなる。
- 変更があった時の修正が大変。
解決策2 : 対象商品のマスタを作り、flagの列を追加する。
具体的には以下です。
<対象商品マスタ>(自分で作る)
商品名 | flag | |
---|---|---|
1 | 商品A | 1 |
2 | 商品B | 1 |
3 | 商品C | 0 |
XLOOKUP関数を使い、集計したいテーブルにflag列を追加する。
A | B | C | |
---|---|---|---|
1 | 商品名 | 売上 | flag |
2 | 商品A | 100 | 1 |
3 | 商品B | 200 | 1 |
4 | 商品C | 150 | 0 |
5 | 商品A | 120 | 1 |
6 | 商品B | 180 | 1 |
そしてsumif。
=sumif(C:C,1,B:B)
メリット :
- 商品数が増えても関数が長くならない。
デメリット:
- テーブルが増える。
解決策3 : FILTER関数 + SUM関数
今回特にメモっておきたいと思ったのがこれです。
具体的には以下です。
A | B | |
---|---|---|
1 | 商品名 | 売上 |
2 | 商品A | 100 |
3 | 商品B | 200 |
4 | 商品C | 150 |
5 | 商品A | 120 |
6 | 商品B | 180 |
=sum(FILTER(B:B,(A:A="商品A") + (A:A="商品B")))
メリット :
- 対象品が増えても関数が長くなりにくい。
- 集計用のマスタテーブルが増えない。
デメリット:
- FILTER関数に慣れていないと少し難しい。
まとめ
どの解決策がいいかはケースバイケースですね。
メモりたかったことは以上です。
補足:FILTER関数
この関数の基本的な形式は以下です。
FILTER(取り出したい範囲, 条件1, [条件2, ...])
例1
仮に商品Aの売上だけを取り出したい場合、以下です。
A | B | |
---|---|---|
1 | 商品名 | 売上 |
2 | 商品A | 100 |
3 | 商品B | 200 |
4 | 商品C | 150 |
5 | 商品A | 120 |
6 | 商品B | 180 |
<関数>
=FILTER(B:B, A:A="商品A")
<出力>
100
120
例2
今度はor条件を加えます。
商品Aか、もしくは商品Bの売上だけをとり出したい場合は以下です。
A | B | |
---|---|---|
1 | 商品名 | 売上 |
2 | 商品A | 100 |
3 | 商品B | 200 |
4 | 商品C | 150 |
5 | 商品A | 120 |
6 | 商品B | 180 |
<関数>
=FILTER(B:B, (A:A="商品A") + (A:A="商品B"))
<出力>
100
200
120
180
or条件を指定するのに+(プラス)を使うのが少し独特ですね。
あとはSUM関数で集計してやれば合計が出ますね。
<関数>
=sum(FILTER(B:B, (A:A="商品A") + (A:A="商品B")))
<出力>
600