ブログ

データフロープラグイン応用|kintoneのテーブルを階層ごとに集計して、同じアプリの別テーブルに出力する

kintone のテーブルに明細を入力していると、
「倉庫ごと」「カテゴリごと」「商品ごと」など、いろいろな切り口で小計を出したくなることがあります。

でも kintone の標準機能では、テーブルの中身をグループごとに集計して、その結果をさらに別のテーブルに書き込む、といったことはできません。

今回は、データフロープラグインを使ってテーブルの明細を階層ごとに集計し、同じアプリの別テーブルに結果を出力するフローをご紹介していきます。

今回のサンプルは以下のテンプレートでご確認いただけます。
入庫記録の階層別集計アプリ


目次


今回作成するフロー

今回は「入庫記録&集計アプリ」を使います。1レコードの中に、入庫の明細テーブルと、3つの集計テーブルを持つアプリです。

テーブル 主なフィールド 役割
入庫記録 日付、倉庫、カテゴリ、商品名、数量、単位、単価、金額 集計元の明細
倉庫別集計 倉庫、倉庫別合計金額 第1階層:倉庫ごとの合計
カテゴリ別集計 倉庫、カテゴリ、カテゴリ別合計金額 第2階層:倉庫×カテゴリごとの合計
商品別集計 倉庫、カテゴリ、商品名、単位、商品別数量、商品別合計金額 第3階層:倉庫×カテゴリ×商品ごとの合計

データフロープラグインは、この入庫記録&集計アプリ自身に設定します。

ジョブ設定の実行契機は、詳細画面の実行ボタンにします。

フローは、
アプリ入力
↓
テーブル分解
↓
グループ集計(倉庫別/カテゴリ別/商品別の3つに分岐)
↓
テーブル構築(3つ)
↓
アプリ結合(2回)
↓
アプリ出力
の流れです。

プロセッサーは多く見えますが、やっていることは「テーブルをばらす → 集計する → テーブルに戻す → ひとつにまとめる → 書き込む」の5段階です。

フロー図


① 入力を設定する

フローの起点となるアプリ入力を設定します。

アプリ入力_プロパティ

入力アプリには「入庫記録&集計アプリ」(プラグインを設定したアプリ自身)を設定します。

使用するレコードの選択は、「イベントのレコードを入力データとする」にします。

こうしておくと、詳細画面で実行ボタンを押したときに、今開いているレコードだけが入力データになります。
以前の記事では契機パラメーターで別アプリのレコードを絞り込みましたが、
今回は集計も出力も同じレコードの中で完結するので、この設定がいちばん簡単です。

フィールドは、「すべて追加」を選択します。


② テーブルを分解する

テーブルのままでは行ごとの集計ができないので、まずテーブル分解でテーブルの1行を1レコードに変換します。

テーブル分解_プロパティ

  • レコードに変換するテーブルフィールド:入庫記録
  • レコードに保持するフィールド:倉庫、カテゴリ、商品名、数量、単位、金額

たとえば入庫記録テーブルに10行あれば、ここで10件のレコードになります。各レコードには、元のレコード番号も引き継がれます。


③ 階層ごとにグループ集計する

分解したレコードを、3つのグループ集計に分岐させます。ここが今回の集計の本体です。

グループ集計は、SQL の GROUP BY のように「グループ化するフィールド」の値が同じレコードをまとめて、「集計設定」で指定した方法で計算します。
階層ごとに、グループ化するフィールドを1つずつ増やしていくのがポイントです。

倉庫別集計

グループ集計(倉庫別)_プロパティ

カテゴリ別集計

グループ集計(カテゴリ別)_プロパティ

商品別集計

グループ集計(商品別)_プロパティ

プロセッサー グループ化するフィールド 集計設定
倉庫別集計 倉庫 金額:合計 → 倉庫別合計金額
レコード番号:最大値 → レコード番号_倉庫別
カテゴリ別集計 倉庫、カテゴリ 金額:合計 → カテゴリ別合計金額
レコード番号:最大値 → レコード番号_カテゴリ別
商品別集計 倉庫、カテゴリ、商品名、単位 数量:合計 → 商品別合計数量
金額:合計 → 商品別合計金額
レコード番号:最大値 → レコード番号_商品別

💡 なぜレコード番号を「最大値」で集計するの?

グループ集計の結果に残るのは、「グループ化するフィールド」と「集計設定」で作ったフィールドだけです。
何もしないとレコード番号が消えてしまい、あとでどのレコードに書き戻すかがわからなくなります。

今回の入力は実行したレコード1件だけなので、レコード番号はすべて同じ値です。
最大値で集計すれば、その値をそのまま持ち回せます。
このレコード番号を、このあとの結合キーと出力の更新キーに使います。

💡 商品別集計で「単位」もグループ化するのはなぜ?

レコード番号と同じ理由で、グループ化するフィールドに入れないと、集計結果から「単位」が消えてしまうからです。
出力先の商品別集計テーブルに単位を表示したいので、グループ化するフィールドに含めています。

同じ商品なら単位も同じなので、グループの数は増えず、集計結果も変わりません。

もし同じ商品を「箱」と「個」の両方で入庫していた場合は、単位ごとに別の行として集計されます。
「10箱」と「5個」を足して「15」としても意味がないので、
数量を正しく合計するためにも、単位でグループを分けておくのが安心です。


④ 集計結果をテーブルに戻す

グループ集計の結果は、1グループ=1レコードの形になっています。
これをテーブル構築で、ふたたび「1レコードの中のテーブル」にまとめます。
3つのグループ集計それぞれの後ろに、テーブル構築を1つずつ置きます。

倉庫別TBL構築

※プロセッサー名の「TBL」はテーブルの略です

テーブル構築(倉庫別)_プロパティ

カテゴリ別TBL構築

テーブル構築(カテゴリ別)_プロパティ

商品別TBL構築

テーブル構築(商品別)_プロパティ

プロセッサー テーブルに保持するフィールド 新しいテーブル名 レコードに保持するフィールド
倉庫別TBL構築 倉庫、倉庫別合計金額 倉庫別集計 レコード番号_倉庫別
カテゴリ別TBL構築 倉庫、カテゴリ、カテゴリ別合計金額 カテゴリ別集計 レコード番号_カテゴリ別
商品別TBL構築 倉庫、カテゴリ、商品名、商品別合計数量、単位、商品別合計金額 商品別集計 レコード番号_商品別

「レコードに保持するフィールド」に③で持ち回したレコード番号を指定すると、同じレコード番号を持つ行が1つのテーブルにまとまります。
これで、3本の流れがそれぞれ「レコード番号+集計テーブル」の1レコードになります。


⑤ 3つの集計結果を結合する

アプリ出力に渡す前に、3本に分かれた流れを1つにまとめます。アプリ結合は2つの入力を結合するプロセッサーなので、2回に分けて結合します。

アプリ結合(1)

アプリ結合(1)_プロパティ

アプリ結合(2)

アプリ結合(2)_プロパティ

プロセッサー 元となる入力 結合する入力 結合キー
アプリ結合(1) 倉庫別TBL構築 カテゴリ別TBL構築 レコード番号_倉庫別 = レコード番号_カテゴリ別
アプリ結合(2) アプリ結合(1) 商品別TBL構築 レコード番号_倉庫別 = レコード番号_商品別

結合方法はどちらも「内部結合」です。これで、1レコードの中に倉庫別集計・カテゴリ別集計・商品別集計の3つのテーブルがそろいます。

💡 同じ名前のフィールドに注意

3つのテーブルには、どれも「倉庫」というフィールドがあります。
アプリ結合では、フィールドコードが重複しないように、あとから結合したほうのフィールドが「倉庫_0」「倉庫_1」のように自動で別のコードになります。

テーブル 結合後のフィールドコード
倉庫別集計 倉庫
カテゴリ別集計 倉庫_0、カテゴリ
商品別集計 倉庫_1、カテゴリ_0

ここで気をつけたいのが、出力先アプリのフィールドコードです。
kintone でテーブルを複製してアプリを作ると、アプリ側のフィールドコードも「倉庫_0」「倉庫_1」のようになりがちです。

すると、アプリ側の「倉庫_1」にデータ側の「倉庫_0」をマッピングする、といった番号のずれが起き、
とても間違えやすくなります。

今回は、アプリ側のフィールドコードを「倉庫_倉庫別」「倉庫_カテゴリ別」「倉庫_商品別」のように、どのテーブルのフィールドかがわかる名前にしておきました。
こうしておくと、次のアプリ出力でマッピングするときに迷いません。


⑥ 出力を設定する

最後に、結合した結果を入庫記録&集計アプリに書き戻します。

アプリ出力_プロパティ(1)

アプリ出力_プロパティ(2)

出力先アプリには、入力と同じ「入庫記録&集計アプリ」を指定します。

出力方法は、「更新」を指定します。

フィールドは以下とします。

  • (出力フィールド)レコード番号:(入力フィールド)レコード番号_倉庫別:更新キーに指定
  • (出力フィールド)倉庫別集計:(入力フィールド)倉庫別集計:テーブル出力方法「再生成」
  • (出力フィールド)カテゴリ別集計:(入力フィールド)カテゴリ別集計:テーブル出力方法「再生成」
  • (出力フィールド)商品別集計:(入力フィールド)商品別集計:テーブル出力方法「再生成」

各テーブルの中のフィールドは、次のようにマッピングします。

テーブル 出力フィールド(アプリ側) 入力フィールド(データ側)
倉庫別集計 倉庫_倉庫別 倉庫
合計金額_倉庫別 倉庫別合計金額
カテゴリ別集計 倉庫_カテゴリ別 倉庫_0
カテゴリ_カテゴリ別 カテゴリ
合計金額_カテゴリ別 カテゴリ別合計金額
商品別集計 倉庫_商品別 倉庫_1
カテゴリ_商品別 カテゴリ_0
商品名_商品別 商品名
数量_商品別 商品別合計数量
単位_商品別 単位
合計金額_商品別 商品別合計金額

アプリ出力の画面では、フィールドは「倉庫 (倉庫_0 | ドロップダウン)」のように、ラベルの後ろのカッコ内にフィールドコードが表示されます。
マッピングやテーブルソートでは、このフィールドコードを見て選んでください。

ポイントは2つです。

  • 集計テーブルは「再生成」にする:実行のたびに集計テーブルの行を作り直すので、明細を修正して再実行しても、古い集計行が残りません。
  • 入庫記録テーブルは「(指定しない)」のままにする:入庫記録テーブルの入力フィールドを「(指定しない)」にしておくと、このテーブルには何も出力されないので、元の明細はそのまま残ります(スクリーンショットでは省略しています)。

また、テーブルソートで各集計テーブルの並び順も指定しておくと、見やすくなります。今回は、倉庫 → カテゴリ → 商品名の昇順にしました。

アプリ出力_プロパティ(3)


⑦ 実行してみる

設定ができたら、実際に動かして確認します。

  1. 入庫記録&集計アプリで、入庫記録テーブルに明細を入力して保存する
  2. 詳細画面で、設定した実行ボタンをクリックする
  3. 倉庫別集計・カテゴリ別集計・商品別集計の3つのテーブルに、集計結果が入っていることを確認する

Before

Before

実行ダイアログ

実行ダイアログ

実行時にダイアログが表示され、各プロセッサーの処理件数を確認できます。最後に「1 件を更新しました」と出ていれば、集計結果が書き戻されています。

After

After

今回のサンプルデータでは、次のような結果になりました。

倉庫 倉庫別合計金額 カテゴリ別の内訳
倉庫A 238,620円 事務用品 216,000円/日用品 22,620円
倉庫B 239,500円 OA用品 145,500円/事務用品 94,000円

明細を追加・修正したときは、もう一度ボタンを押すだけで、3つの集計テーブルがすべて最新の内容に作り直されます。


補足

集計方法は合計以外も選べます

グループ集計の集計設定では、合計のほかにも次の集計方法を選べます。

  • 平均、中央値、最大値、最小値
  • 母標準偏差、標本標準偏差
  • 個数
  • 文字列結合

例)商品別集計に「入庫回数(個数)」や「平均単価(平均)」を追加する、など。

階層は増やしたり減らしたりできます

今回は3階層にしましたが、グループ集計 → テーブル構築の組を増やせば、階層を増やすこともできます。その場合は、アプリ結合も1回ずつ増やします。

実行契機はボタン以外にも選べます

実行契機を「レコード編集画面のレコード保存成功後」にすると、明細を保存したタイミングで自動的に集計できます。
詳しくは以前の記事の「実行契機はボタン以外にも選べます」をご覧ください。

その他の実行契機については こちら を参照してください。

今回使ったプロセッサーについて

今回は、テーブル分解・グループ集計・テーブル構築・アプリ結合と、いくつかのプロセッサーを組み合わせました。
各プロセッサーの概要や、ほかにどんなプロセッサーがあるかは こちら を参照してください。


まとめ

kintone の標準機能では、テーブルの明細をグループごとに集計して別のテーブルに書き込むことはできません。

今回のように、

  • テーブル分解で、明細を1行ずつのレコードにする
  • グループ集計で、階層ごとにグループ化するフィールドを増やしながら集計する
  • テーブル構築とアプリ結合で、集計結果を1レコードのテーブルにまとめ直す
  • アプリ出力で、集計テーブルを「再生成」して書き戻す

としておけば、ボタン1つで階層ごとの集計テーブルを作れます。

今回のアプリは、テンプレート「入庫記録の階層別集計アプリ」として配布しています。
すぐに試したい方はご利用ください。

同じような悩みをお持ちでしたら、ぜひ試してみてください。
設定方法などわからないことがあれば、お気軽にご相談ください。

ブログ一覧に戻る