
目次
Notionのロールアップで、集計した数字がどうも合わない。よく言われるのは「リレーションのつなぎ忘れ」ですが、つなぎ方が正しくても数字がずれることがあります。原因は、たどった先に混ざっている空欄です。
やっかいなのは、空欄の扱いが計算ごとにばらばらなことです。無視するものもあれば、分母に数えるものもある。全部が空欄のときには、0を返すものと何も表示しないものに割れます。
この記事では、実際にデータベースを作って5パターンで試した結果を並べます。数字はすべて手元で計測したものです。ロールアップそのものの選び方は前回の記事でまとめているので、あわせて読むと切り分けが早くなります。
空欄が1つあるだけで、計算ごとに違う答えが返る
まず結論から見てもらったほうが早いので、実測の結果を先に出します。
試したのは、点数プロパティの5パターン
タスクのデータベースに「点数」という数値プロパティを作り、プロジェクト側から集計しました。用意したのは次の5つです。
- A:3件すべてに値がある(10・20・30)
- B:3件のうち1件が空欄(10・空欄・30)
- C:3件すべてが空欄
- D:1件だけつないでいて、値がある(10)
- E:1件だけつないでいて、空欄
それぞれに8種類の計算を当てて、返ってきた値をそのまま記録しました。
実測の結果
まず、数値そのものを扱う4つです。
| ケース | 合計 | 平均 | 中央値 | 最大 |
|---|---|---|---|---|
| A 全部に値 | 60 | 20 | 20 | 30 |
| B 1件が空欄 | 40 | 20 | 20 | 30 |
| C 全部が空欄 | 0 | 空 | 0 | 空 |
| D 1件・値あり | 10 | 10 | 10 | 10 |
| E 1件・空欄 | 0 | 空 | 0 | 空 |
続いて、件数と割合を扱う4つです。
| ケース | すべて | 値の数 | 未入力 | 未入力 以外% |
|---|---|---|---|---|
| A 全部に値 | 3 | 3 | 0 | 100% |
| B 1件が空欄 | 3 | 2 | 1 | 66.7% |
| C 全部が空欄 | 3 | 0 | 3 | 0% |
| D 1件・値あり | 1 | 1 | 0 | 100% |
| E 1件・空欄 | 1 | 0 | 1 | 0% |
列の名前は画面の表示を短くしています。「すべて」はすべてカウント、「値の数」は値の数をカウント、「未入力」は未入力をカウント、「未入力以外%」は未入力以外の割合です。
この表から読み取れること
3つあります。どれも、名前からは想像しにくい動きです。
1つ目。Bの平均が20になっています。10と30を足した40を、3ではなく2で割った数字です。空欄が分母から外れています。3で割れば13.3ですが、そうはなりません。
2つ目。同じBで、未入力以外の割合は66.7%です。こちらは3件を分母にしています。つまり同じデータなのに、平均は2で割り、割合は3で割っています。
3つ目。Cの列が割れています。全部が空欄のとき、合計と中央値は0を返し、平均と最大は何も表示しません。同じ「値が1つもない」状態に対して、返し方が2種類あります。
平均だけ、分母が違う
ここが、この記事でいちばん伝えたいところです。
合計は、空欄を無視して足す
Bのケースで合計は40でした。10と30だけを足しています。空欄を0として足しても結果は同じなので、合計を見ているぶんには違いに気づけません。
実際、別の検証でも同じでした。1000・2000・空欄・3000・4000という5件で合計は10000です。空欄が0として扱われようが無視されようが、合計だけを見ていると区別がつきません。
平均は、分母からも外す
違いが出るのは平均です。さきほどの1000・2000・空欄・3000・4000で、平均は2500でした。10000を4で割った数字です。
5件つないでいるので5で割れば2000ですが、そうはなりません。値が入っている4件だけで計算しています。
これは、平均の意味としては自然な動きです。ただ「5件のタスクの平均点」を出したつもりでいると、実際には「点数を入力した4件の平均点」が出ていることになります。入力漏れがあるほど、平均は実態より高く出ます。
入力漏れが増えるほど、平均はどれだけずれるか
ずれ幅を具体的に見ておきます。5件のタスクがあって、点数が1000・2000・3000・4000で、1件が空欄という状態でした。
Notionの平均は2500です。ところが「未入力は0点」という前提で5件の平均を出すなら、10000÷5で2000になります。その差は500、率にして25%です。
入力漏れが2件に増えれば、Notionの平均は3000(9000÷3、値が3件の場合)まで上がるのに対し、0点扱いの平均は下がっていきます。未入力が多いチームほど、平均点は実態より高く見えます。
評価やスコアリングにこの数字を使っていると、入力が遅れているメンバーほど平均が高く出る、という逆転が起きます。
割合系の分母は、つないだ全件
一方で、未入力の割合や未入力以外の割合は、つないだ件数をそのまま分母にします。Bで66.7%というのは2÷3です。
だから、同じデータベースで平均と進捗率を並べて置くと、片方は入力済みの件数で、もう片方は全件で計算された数字が、隣り合って表示されることになります。
図にするとこうなります
全部が空欄のとき、0が返る計算と空になる計算がある
Cのケース、つまり3件つないでいるのに全部が空欄という状態です。ここでの返り方が計算によって割れます。
合計は0、平均は空
合計は0を返しました。1つも値がないので、足すものがなくて0という理屈は分かります。
平均は何も表示しません。0で割ることになるので、計算できないという扱いです。最大も同じく空になりました。
問題は、この2つを同じ表に並べたときです。合計の列には0が入り、平均の列は空白になります。同じ状態なのに、見た目が違う。データが入っていないのか、それとも0という値なのかが、見ただけでは区別できません。
中央値は、値が1つもないのに0を返す
意外だったのがこれです。中央値は0を返しました。
平均は空になるのに、中央値は0になります。どちらも「値が1つもない状態」を受け取っているのに、返し方が違います。
実務で困るのは、この0が「本当に0点だった」のか「まだ誰も入力していない」のか、区別がつかないことです。中央値でランキングを作ると、未入力のプロジェクトが0点として最下位に並びます。
ダッシュボードに並べると混ざる
ここまでをまとめると、値が1つもないときの返り方はこう割れます。
| 0が返る | 何も表示しない |
|---|---|
| 合計/中央値/すべてカウント/値の数をカウント | 平均/最大/最小 |
プロジェクト一覧をダッシュボードとして使っていると、0と空白が同じ表に混ざります。見た目を整えたいなら、数式プロパティで受け直して表示を揃えるのが現実的です。やり方は後述します。
リレーションが0件のときも同じことが起きる
タスクを1件もつないでいないプロジェクトでも、同じ割れ方をしました。
すべてカウントは0、値の数をカウントも0、合計も0。一方で平均・最大・未入力以外の割合は何も表示しません。
つまり「つないでいない」と「つないだけど全部空欄」は、ロールアップの見た目では区別できません。どちらも0と空白の組み合わせになります。
切り分けたいなら、ロールアップの隣にリレーションの列を並べて表示するのがいちばん早いです。中身が空ならつないでいない、行が入っていれば空欄が原因だと分かります。
空欄を0として扱いたいときの数式
ここまでの動きは変えられないので、扱いを変えたいなら数式プロパティで受け直します。実際に3つ試したので、動いたものと動かなかったものを結果つきで載せます。試したデータは10・空欄・30の3件です。
空欄のときだけ0にする
ロールアップの値が空だったら0を、そうでなければその値を返す形です。プロジェクト側に数式プロパティを追加して、こう書きます。
if(empty(prop("平均")), 0, prop("平均"))
ここでの「平均」は、平均のロールアップに付けた列の名前です。名前をそのまま参照するので、列名を変えると数式も直す必要があります。
結果は、10・空欄・30のときが20、リレーションが0件のプロジェクトでは0になりました。空白だった箇所が0で埋まります。ダッシュボードの見た目を揃えたいときは、これで足ります。
分母を全件にした平均を出す
「未入力は0点として、つないだ全件で割る」という平均を出したい場合です。合計とすべてカウントを2本のロールアップで先に取っておき、数式で割ります。
if(prop("件数") == 0, 0, prop("合計") / prop("件数"))
10・空欄・30で試したところ、13.333…が返りました。40を3で割った数字です。Notionの平均が返す20とは別の数字が、同じデータから出せています。
0で割るとエラーになるので、件数が0のときは0を返す分岐を必ず入れます。ここを省くと、タスクを1件もつないでいないプロジェクトで表示が崩れます。
うまくいかなかった書き方
数値に変換すれば埋まるかと思って、こちらも試しました。
toNumber(prop("平均"))
結果は、リレーションが0件のプロジェクトで空のままでした。空の値を数値に変換しても空です。0で埋めたいなら、素直に分岐を書く必要があります。
どちらの列を人に見せるか
数式で受け直すと、ロールアップの列と数式の列が2本並びます。両方を表示しておく必要はありません。
ビューの設定でロールアップの列を非表示にして、数式の列だけを見せるのがすっきりします。計算の中身を追いたいときだけ、ロールアップの列を表示に戻せば確認できます。
チェックボックスの空欄は、数値の空欄と扱いが違う
もうひとつ、混同しやすいところがあります。チェックボックスのプロパティです。
オフは「未入力」として数えられる
5件のうち2件にチェックが入っている状態で試したところ、値の数をカウントは0を返しました。チェックが入っている2件すら数えられていません。
チェックボックスには、数値やテキストのような「未入力」という状態がありません。オンかオフかの2つだけです。そしてオフは「値が入っていない」と見なされます。
件数を数えたいなら、すべてカウントを使います。こちらは5を返しました。
完了率を出すなら専用の計算がある
チェックの数や割合を知りたいときは、チェックボックス専用の計算を使います。同じ5件(2件にチェック)で、チェックありは2、チェックなしは3、チェックありの割合は40%でした。
未入力以外の割合で完了率を出そうとすると、チェックボックスでは0%にしかなりません。計算の種類を取り違えている典型例です。
空欄をどう扱うか、設計する前に決める
ここまで見てきたとおり、Notionは空欄の扱いを1つに決めていません。だから、使う側が先に決める必要があります。目的別に整理します。
分母を「つないだ全件」にしたい
「5件のタスクの平均点」を、入力漏れも0点として含めて出したい場合です。この場合、平均をそのまま使うと分母がずれます。
やり方は2つあります。1つは、子のデータベース側で空欄をなくすこと。点数の初期値を0にしておけば、平均の分母は常に全件になります。運用でカバーする方法です。
もう1つは、合計とすべてカウントを2本のロールアップで取り、数式で割る方法です。合計は空欄を無視して足すので、これを全件で割れば「未入力を0点とみなした平均」になります。分母を自分で決められるので、こちらのほうが確実です。
分母を「入力済みだけ」にしたい
「点数をつけた人の平均点」を出したい場合は、平均をそのまま使えます。Notionの平均は最初からこの動きです。
ただし、この場合は分母が何件だったのかを併記しておくことをおすすめします。値の数をカウントを隣に置いておけば、「4件の平均です」と分かります。分母が見えない平均は、あとから見た人が誤解します。
見た目を0でそろえたい
0と空白が混ざるのが気になる場合は、数式プロパティで受け直します。ロールアップの値をそのまま表示するのではなく、空だったら0に置き換えて表示する列を1本作る形です。
この方法は、並べ替えのときにも効きます。空白のままだと並べ替えの順番が意図しない形になりますが、0に揃えておけば数値として素直に並びます。表示用と計算用で列を分ける、という考え方です。
自分のデータで確かめる手順
この記事の数字は手元での計測結果ですが、自分の環境でも同じか確かめておくと安心です。5分で終わります。
手順1:検証用の行を3つ作る
本番のデータベースでいきなり試さず、テスト用のプロジェクトを1つ作ります。そこに子のタスクを3件つなぎ、1件だけ値を空欄にしておきます。
本番のデータで試すと、あとで消し忘れた行が集計に混ざります。テスト用だと分かる名前を付けておくと片付けが楽です。
手順2:同じプロパティに2種類のロールアップを当てる
同じ点数プロパティに対して、平均のロールアップと、未入力以外の割合のロールアップを1本ずつ作ります。列を隣同士に並べておきます。
ここで分母の違いが目に見えます。値が10と30で1件が空欄なら、平均は20、割合は66.7%になるはずです。
手順3:全部を空欄にして、もう一度見る
3件とも値を消します。合計は0、平均は空白になれば、この記事と同じ動きです。中央値の列も出しておくと、こちらだけ0が入るのが見えます。
ここで「値が1つもないのに0が入る列」と「空白になる列」が、自分の目で区別できるようになります。ダッシュボードを作る前にこれを見ておくと、あとから列を作り直さずに済みます。
手順4:リレーションを外して、0件の状態も見る
最後に、テスト用プロジェクトからタスクを全部外します。リレーションのセルを開いて、ひもづけを1件ずつ解除するだけです。
ここでも、すべてカウントと合計は0、平均と最大は空白になります。手順3とまったく同じ見た目です。「つないでいない」と「つないだけど空欄」が区別できないというのは、こうやって並べてみると分かります。
本番のデータで数字がおかしいとき、まずこの2つのどちらなのかを切り分けます。切り分けの方法は、ロールアップの隣にリレーションの列を出すこと。行が入っていなければ前者、入っていれば後者です。
片付けを忘れない
確認が終わったら、テスト用に作ったプロジェクトとタスクは消します。残しておくと、本番の集計に混ざって別の「数字が合わない」を生みます。
テスト用と分かる名前を付けておけば、あとから探して消すのが楽です。私は先頭に記号を付けて、フィルタで一括で見つけられるようにしています。
よくある質問(FAQ)
ロールアップの平均が空欄になってしまいます。
たどった先の値が1件も入っていない状態です。1件でも値があれば平均は計算されます。まずリレーションの隣に対象のプロパティを並べて表示し、本当に全部空欄なのかを確認してください。つないだ行が0件のときも同じく空欄になります。
平均の分母を、つないだ全件にできますか。
平均の設定では変えられません。合計とすべてカウントを2本のロールアップで取り、数式で割ると、分母を自分で決められます。もしくは子のデータベース側で初期値を0にして、空欄そのものをなくす方法もあります。
合計は空欄を0として足しているのですか。
合計だけを見ていると区別がつきません。10・空欄・30で合計は40になり、これは空欄を無視しても0として足しても同じ結果です。ただし平均が20(40÷2)になることから、空欄は分母に数えられていないことが分かります。
中央値が0と表示されます。値は入れていないはずです。
値が1つもないとき、中央値は0を返します。平均が空欄になるのとは動きが違います。この0は「0という値があった」わけではないので、ランキングなどに使うと未入力の行が最下位に並びます。値の数をカウントを隣に置いて、そもそも件数が0でないかを確認してください。
0と空白が混ざって見た目が揃いません。
値が1つもないとき、合計・中央値・カウント系は0を返し、平均・最大・最小は何も表示しません。見た目を揃えたいなら、数式プロパティで受け直して、空だったら0に置き換える列を作ります。並べ替えのときにも同じ方法が効きます。
数式で空欄を0にしたら、平均の値も変わりますか。
変わりません。数式は表示用の別の列を作っているだけで、元のロールアップの計算には影響しません。分母を変えた平均が欲しい場合は、合計とすべてカウントを別々に取って、数式で割る必要があります。10・空欄・30で試したところ、Notionの平均は20、全件で割った数式は13.333…と、別の数字が並びました。
つないでいないのか、空欄なのかを見分ける方法はありますか。
ロールアップの値だけでは区別できません。どちらも0と空白の組み合わせになります。ロールアップの隣にリレーションの列を並べて表示すると、行が入っているかどうかで切り分けられます。
空欄を1つ作るだけで、違いは見えます
テスト用のプロジェクトを1つ作り、3件のうち1件を空欄にする。それだけで、平均と割合の分母が違うことが目で確認できます。手を動かしたほうが、この話は早く腹に落ちます。