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)

アプリ結合(2)

| プロセッサー | 元となる入力 | 結合する入力 | 結合キー |
|---|---|---|---|
| アプリ結合(1) | 倉庫別TBL構築 | カテゴリ別TBL構築 | レコード番号_倉庫別 = レコード番号_カテゴリ別 |
| アプリ結合(2) | アプリ結合(1) | 商品別TBL構築 | レコード番号_倉庫別 = レコード番号_商品別 |
結合方法はどちらも「内部結合」です。これで、1レコードの中に倉庫別集計・カテゴリ別集計・商品別集計の3つのテーブルがそろいます。
💡 同じ名前のフィールドに注意
3つのテーブルには、どれも「倉庫」というフィールドがあります。
アプリ結合では、フィールドコードが重複しないように、あとから結合したほうのフィールドが「倉庫_0」「倉庫_1」のように自動で別のコードになります。
| テーブル | 結合後のフィールドコード |
|---|---|
| 倉庫別集計 | 倉庫 |
| カテゴリ別集計 | 倉庫_0、カテゴリ |
| 商品別集計 | 倉庫_1、カテゴリ_0 |
ここで気をつけたいのが、出力先アプリのフィールドコードです。
kintone でテーブルを複製してアプリを作ると、アプリ側のフィールドコードも「倉庫_0」「倉庫_1」のようになりがちです。
すると、アプリ側の「倉庫_1」にデータ側の「倉庫_0」をマッピングする、といった番号のずれが起き、
とても間違えやすくなります。
今回は、アプリ側のフィールドコードを「倉庫_倉庫別」「倉庫_カテゴリ別」「倉庫_商品別」のように、どのテーブルのフィールドかがわかる名前にしておきました。
こうしておくと、次のアプリ出力でマッピングするときに迷いません。
⑥ 出力を設定する
最後に、結合した結果を入庫記録&集計アプリに書き戻します。


出力先アプリには、入力と同じ「入庫記録&集計アプリ」を指定します。
出力方法は、「更新」を指定します。
フィールドは以下とします。
- (出力フィールド)レコード番号:(入力フィールド)レコード番号_倉庫別:更新キーに指定
- (出力フィールド)倉庫別集計:(入力フィールド)倉庫別集計:テーブル出力方法「再生成」
- (出力フィールド)カテゴリ別集計:(入力フィールド)カテゴリ別集計:テーブル出力方法「再生成」
- (出力フィールド)商品別集計:(入力フィールド)商品別集計:テーブル出力方法「再生成」
各テーブルの中のフィールドは、次のようにマッピングします。
| テーブル | 出力フィールド(アプリ側) | 入力フィールド(データ側) |
|---|---|---|
| 倉庫別集計 | 倉庫_倉庫別 | 倉庫 |
| 合計金額_倉庫別 | 倉庫別合計金額 | |
| カテゴリ別集計 | 倉庫_カテゴリ別 | 倉庫_0 |
| カテゴリ_カテゴリ別 | カテゴリ | |
| 合計金額_カテゴリ別 | カテゴリ別合計金額 | |
| 商品別集計 | 倉庫_商品別 | 倉庫_1 |
| カテゴリ_商品別 | カテゴリ_0 | |
| 商品名_商品別 | 商品名 | |
| 数量_商品別 | 商品別合計数量 | |
| 単位_商品別 | 単位 | |
| 合計金額_商品別 | 商品別合計金額 |
アプリ出力の画面では、フィールドは「倉庫 (倉庫_0 | ドロップダウン)」のように、ラベルの後ろのカッコ内にフィールドコードが表示されます。
マッピングやテーブルソートでは、このフィールドコードを見て選んでください。
ポイントは2つです。
- 集計テーブルは「再生成」にする:実行のたびに集計テーブルの行を作り直すので、明細を修正して再実行しても、古い集計行が残りません。
- 入庫記録テーブルは「(指定しない)」のままにする:入庫記録テーブルの入力フィールドを「(指定しない)」にしておくと、このテーブルには何も出力されないので、元の明細はそのまま残ります(スクリーンショットでは省略しています)。
また、テーブルソートで各集計テーブルの並び順も指定しておくと、見やすくなります。今回は、倉庫 → カテゴリ → 商品名の昇順にしました。

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

実行ダイアログ

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

今回のサンプルデータでは、次のような結果になりました。
| 倉庫 | 倉庫別合計金額 | カテゴリ別の内訳 |
|---|---|---|
| 倉庫A | 238,620円 | 事務用品 216,000円/日用品 22,620円 |
| 倉庫B | 239,500円 | OA用品 145,500円/事務用品 94,000円 |
明細を追加・修正したときは、もう一度ボタンを押すだけで、3つの集計テーブルがすべて最新の内容に作り直されます。
補足
集計方法は合計以外も選べます
グループ集計の集計設定では、合計のほかにも次の集計方法を選べます。
- 平均、中央値、最大値、最小値
- 母標準偏差、標本標準偏差
- 個数
- 文字列結合
例)商品別集計に「入庫回数(個数)」や「平均単価(平均)」を追加する、など。
階層は増やしたり減らしたりできます
今回は3階層にしましたが、グループ集計 → テーブル構築の組を増やせば、階層を増やすこともできます。その場合は、アプリ結合も1回ずつ増やします。
実行契機はボタン以外にも選べます
実行契機を「レコード編集画面のレコード保存成功後」にすると、明細を保存したタイミングで自動的に集計できます。
詳しくは以前の記事の「実行契機はボタン以外にも選べます」をご覧ください。
その他の実行契機については こちら を参照してください。
今回使ったプロセッサーについて
今回は、テーブル分解・グループ集計・テーブル構築・アプリ結合と、いくつかのプロセッサーを組み合わせました。
各プロセッサーの概要や、ほかにどんなプロセッサーがあるかは こちら を参照してください。
まとめ
kintone の標準機能では、テーブルの明細をグループごとに集計して別のテーブルに書き込むことはできません。
今回のように、
- テーブル分解で、明細を1行ずつのレコードにする
- グループ集計で、階層ごとにグループ化するフィールドを増やしながら集計する
- テーブル構築とアプリ結合で、集計結果を1レコードのテーブルにまとめ直す
- アプリ出力で、集計テーブルを「再生成」して書き戻す
としておけば、ボタン1つで階層ごとの集計テーブルを作れます。
今回のアプリは、テンプレート「入庫記録の階層別集計アプリ」として配布しています。
すぐに試したい方はご利用ください。
同じような悩みをお持ちでしたら、ぜひ試してみてください。
設定方法などわからないことがあれば、お気軽にご相談ください。