map関数とfilter関数を使って、家計簿などのカテゴリー別×月別集計を作成してみます。
私は基本的にカテゴリーのデータベースを別に作成してリレーションしているので、カテゴリー別の集計はよく使っていたのですが、今回は一歩踏み込んで月別でも表示されるようにしてみました。
カテゴリー別×月別の集計
完成したものがこちら。3月、4月に発生したカテゴリごとの月別合計とカテゴリごとの全合計が確認できます。
これの作り方を解説します!
カテゴリーデータベースを作成
まずは、カテゴリーのデータベースを作成します。
単純なタグではなくデータベースを用意することで、項目ごとの分析ができるようになったり、ページの遷移がしやすくなるメリットがあります。
カテゴリーは一回設定すれば使いまわせるので、アイコンもつけてみます。
入力用のデータベースを作成
次に入力データベースを作成し、カテゴリーデータベースと相互リレーションさせます。
その他の入力項目は「日付」「金額」としました。
さらに下準備として、「月」を判定する列を追加し、以下の式を設定します。
次の工程でこの「月」でフィルターをかけることで、月ごとの合計を出せるようになります。
month(date)
month(prop("日付"))
map関数、filter関数を設定
カテゴリーデータベースに月ごとの集計列を追加します。
例えば3月なら、月を3でフィルターしてから金額をリストで返し、それを合計します。
一個ずつ組み立てると分かりやすいと思いますので、コメント付きで数式を記載します。
リスト.filter(current.条件)
リスト.map(current.列名)
/*「集計」データベースに対して*/
prop("集計")
/*「月」列を3でフィルターし、*/
.filter(current.prop("月") == 3)
/*該当する「金額」列の値を表示し*/
.map(current.prop("金額"))
/*値を合計する*/
.sum()
あとはプロパティをコピーしてフィルターする数字を変更すれば、対応する月ごとの集計ができるので、12ヶ月分作成します。画像の例ではついでにフィルターなしの合計列も作成してみました。
最後の関数sum()
を変更すればカウントや平均値も出せますよ。
map関数の基本的な使い方はこちらも参考にしてみてください。
おわりに
個人的によく使うカテゴリ別の合計値を出す方法でした。
このやり方は出したい項目の数だけ横に列が増えていくので、12ヶ月分が限界かなと思います。見るもの作るのも大変です。
ただ、一度数式を書いてしまえばあとは都度入力するだけなので便利かなと思います。