
目次
Notionで数式を使っていて、集計の数字が思ったものと違うことはないでしょうか。
元のデータは正しい。数式も合っている。それなのに平均が合わない。
原因を確かめました。数式を1枚かませるだけで、空欄が0に変わります。そして0は、集計の分母に入ります。
空欄を掛けると、0が返る
まず、数式が空欄をどう扱うかを見ます。
何も入っていない行で試しました
数値の列を用意して、値を入れないまま数式を計算させます。
| 数式 | 空の行での結果 |
|---|---|
| 数値 × 2 | 0 |
| 数値 + 10 | 10 |
| 文字の長さ | 0 |
空欄は空欄のまま返る、と思っていました。実際には0として計算されます。
「数値 + 10」が10になっているのが分かりやすいと思います。空欄に10を足したら10。つまり空欄を0として扱っています。
それ自体は、悪いことではありません
計算できる値が返るのは、便利な場面もあります。未入力の行でもエラーにならず、表が崩れません。
問題は、その0が「本当に0だった行」と区別できなくなることです。
同じ元データで、平均が150と200に分かれた
ここが今回の本題です。
3行のうち1行を空にして、集計しました
数値の列に100、200、そして空欄の3行を用意します。この3行を親のページから集計しました。
同時に、「数値 × 2」という数式の列も集計します。数式のほうは200、400、そして0になっているはずです。
| 集計したもの | 平均 | 合計 |
|---|---|---|
| 数値そのもの | 150 | 300 |
| 数値 × 2 の数式 | 200 | 600 |
本来なら300になるはずです
数値の平均が150なら、それを2倍した数式の平均は300になるはずです。返ってきたのは200でした。
理由は分母です。数値そのものを平均するときは、空欄の行が分母に入りません。100と200の2件で割って150。
数式のほうは、空欄の行が0という値になっています。だから3件として数えられて、200足す400足す0を3で割って200。
数式を1枚かませただけで、分母が2から3に変わりました。
合計なら一致します
合計を見ると、300と600で、きちんと2倍になっています。0を足しても合計は変わらないからです。
ずれるのは平均だけ。合計で検算しても気づけません。
図にすると、こういう分かれ方です
件数も変わります
もう1つ、はっきり差が出たところがあります。
2件と3件に分かれました
値が入っている件数を数える集計も同時に試しました。
| 数えたもの | 件数 |
|---|---|
| 数値そのもの | 2件 |
| 数値 × 2 の数式 | 3件 |
数式の列は全行に値が入っているので、3件になります。入力率を測るために件数を数えているなら、数式を数えてはいけません。
「100件中80件入力済み」を出したいときに、数式を対象にすると必ず100件になります。
0になるものと、空のままのもの
すべてが0になるわけではありませんでした。
結果が空になる場合もあります
| 数式 | 空の行での結果 |
|---|---|
| 数値 × 2 | 0 |
| 0で割る | 空 |
| 日付の差を出す | 空 |
| チェックで分岐する | 「未」(文字が返る) |
0で割った場合と、日付が空のまま差を出した場合は、結果が空になりました。エラーにはなりません。
チェックボックスで分岐する数式は、チェックが入っていない行でも「未」という文字が返ります。チェックボックスには空という状態がないからだと思います。
見分け方は、計算の種類で決まります
数値として足したり掛けたりする計算は、空欄を0として扱います。日付の差や、割り算で答えが出ない場合は、空が返ります。
集計するときに困るのは、0になるほうです。空のままなら、他の空欄と同じ扱いで分母から外れます。
型が違っても、エラーになりません
もう1つ、気をつけたい挙動がありました。
文字と数値を足しても通ります
文字の列と数値の列を足す数式を作りました。型が合わないので拒否されると思っていましたが、作れてしまいます。
空の行での結果は0でした。動いてはいるのですが、意図した計算ではありません。
止まるのは、列が存在しないときだけ
一方、存在しない列名を参照する数式は、作る時点で拒否されました。型の誤りだと明示されます。
| 数式 | 結果 |
|---|---|
| 文字 + 数値 | 作れる(0が返る) |
| 存在しない列を参照 | 拒否される |
つまり、列名の打ち間違いは止まりますが、型の組み合わせ間違いは通ります。作れたからといって、正しいとは限りません。
狂わせないための書き方
ここまでを踏まえた対策です。
1. 未入力なら、空を返す
いちばん効くのがこれです。値が入っていない行では、計算せずに空を返すようにします。
「値が空なら空、そうでなければ計算する」という形の分岐を1つ入れるだけです。こうすると、数式の列も元の列と同じ分母で集計されます。
数式が少し長くなりますが、集計が合うほうがずっと大事です。
2. 平均を出すなら、元の列を集計する
数式を経由せずに済むなら、そのほうが確実です。
元の列をそのまま集計して、必要なら結果を倍にする。計算の順番を変えるだけで、分母の問題を避けられます。
数式を経由する必要があるのは、行ごとに違う計算をするときだけです。全行に同じ倍率をかけるだけなら、あとから掛ければ済みます。
3. 件数は、元の列で数える
入力率や進捗率を出すために件数を数えるなら、必ず元の列を対象にします。数式の列を数えると全件になります。
ここは間違えやすいところです。数式で「入力済みなら1」のような列を作って数えたくなりますが、その列は全行に値が入ります。
4. 数式を作ったら、空の行を1つ作って見る
いちばん簡単な確認方法です。何も入力していない行を1つ作って、数式の列に何が出るかを見ます。
0が出ていたら、集計に影響します。空なら安全です。30秒でできて、あとから原因を探すより何倍も速いです。
5. 平均が合わないと思ったら、分母を疑う
以前、集計では平均だけ分母が違うという話を書きました。今回のことは、その続きにあたります。
数値をそのまま集計するときは、空欄が分母から外れます。数式を挟むと、空欄が0になって分母に入ります。どちらも仕様どおりですが、結果は変わります。
合計は一致するので、合計で検算しても気づけません。平均が合わないときは、まず何を集計しているかを確認してください。
よくある質問(FAQ)
空欄が0になるのは、どの計算ですか。
数値として足したり掛けたりする計算です。文字の長さを数える計算でも0が返りました。一方、0で割った場合や、日付が空のまま差を出した場合は空が返ります。作ったら空の行で確認するのが確実です。
数式で空を返すには、どう書けばいいですか。
「値が空かどうか」を判定して、空なら空を返す分岐を入れます。条件分岐の関数と、空かどうかを調べる関数を組み合わせる形です。数式は長くなりますが、集計が合うようになります。
合計は合っているのに、平均だけ違います。
今回の話がそのまま当てはまります。0を足しても合計は変わりませんが、平均の分母は増えます。数式の列を集計していないかを確認してみてください。
進捗率を数式で出したいのですが。
件数を数える部分は、数式ではなく元の列を対象にしてください。数式の列は全行に値が入るので、必ず全件になります。
型が合わない数式が作れてしまうのは、なぜですか。
理由は確かめられていません。分かっているのは、文字と数値を足す数式が作成時に拒否されなかったことと、存在しない列を参照する数式は拒否されたことです。作れたからといって正しいとは限らない、と考えておくのが安全です。
数式の中で、別の数式を参照できますか。
できました。参照された側の結果を使って計算されます。ただし、元の数式が空欄を0にしていれば、その0が伝わっていきます。
空の行を1つ作って、見てみてください
何も入力していない行を作って、数式の列に何が出るかを確認する。0が出ていたら、その列は集計の分母に入っています。30秒で終わって、あとから原因を探すより何倍も速いです。