※2020年1月20日追記:COUNTUNIQUEIFSがいつの間にか正式な関数として利用できるようになっていました。 https://support.google.com/docs/answer/9584429?hl=ja
ちょうど仕事で聞かれたので、いわばUniqueCountIfs的なものをGoogle Spreadsheetsで作る場合のメモ。
とにかく条件付き集計はXXX(FILTER())が汎用性的には最もいいということが前に検証できたので、今回もたぶんコレでいけるだろう。
GoogleSpreadsheetsで条件付き集計の書き方、何がいいのか - ミネムラ珈琲ブログ
その前にそういうのが標準関数でないかは調べてみる。
Excelでやったことあるけど、これクソダルイんですよね。重複してるかどうかのフラグ列を作って、同じ値で割った数を足し上げるとか。
軽く調べると状況に変わりはなくて、SUMPRODUCTで書くとか(あんまり好きじゃないからうまく動くか知らないけど)。
というわけでいつものやつでやります。
countuniqueifsの例 - Google スプレッドシート
=COUNTUNIQUE(FILTER(native_country,age>=45,race=A3))
人種ごとに年齢45以上のサンプルが住む出身国の数を集計しました。相変わらず集計している対象が意味不明。
※修正
別件に使っていたときに、この式ではFILTER式の結果が何もない際に、#N/Aが返却されて、COUNTUNIQUEの結果が1となってしまう不具合に気づいた。
=IF(ISNA(FILTER(native_country,age>=45,race=A3)),0,COUNTUNIQUE(FILTER(native_country,age>=45,race=A3)))
取り急ぎ上記のように修正したらよい。
しかしこの書き方めんどくさい・・・。SpreadsheetにLambda式みたいなの実装してくれないだろうか・・・。
※さらに修正
同僚のid:taraoさんから、
FILTER(native_country,age>=45,race=A3)
を何度も書かないでいい方法がないか提案をもらって、二人でごちゃごちゃやっているとスッキリ掛ける方法が見つかった。
=COUNTUNIQUE(iferror(FILTER(native_country,age>=45,race=A3),""))
iferrorでつつんでやって、フィルタ対象が見つからない場合は空文字として扱えば、countしたときに0として扱うことができる。初期版よりも式の文字数は半分に減るし、直感的にわかりやすい。
countuniqueifsの例 - Google スプレッドシート
こちらをご利用ください。