0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rex0220 kSQL アクションプラグイン - 事例: 全顧客の集計を作り直す

0
Last updated at Posted at 2026-11-08

「rex0220 kSQL アクションプラグイン」の事例です。やりたいことから探せる事例集の 1 件です。

この記事は、ひとつの業務を、画面・設定・SQL・AI への頼み方まで通して見せます。設定の要点・SQL の全文・AI への頼み方は畳んであります(開くと読めます)。機能ごとの説明は、末尾の「関連記事」にある概要と ①〜⑫ の記事にまとめてあります。

やりたいこと

受注を顧客ごとにまとめて、件数と売上を別のアプリ(顧客別集計)に入れている。ふだんは受注を保存するたびに、その顧客の分だけを集計し直している(③ 集計編の形)。

ただ、ファイルからの読み込み(CSV)や、ほかのプラグイン・API からの更新では画面のイベントが動かないので、集計がずれることがある。月末などに、ボタン 1 つで全顧客の集計を作り直したい。

作り直すと、顧客ごとに次のようになります。

  • 受注のある顧客は、件数と売上を書き直す
  • 集計に行が無かった顧客(新しい顧客)は、行を足す
  • 受注が無くなった顧客の行は、消す

担当者ごとの内訳(顧客別集計明細)も、同じ考え方で作り直します。

画面と結果

一覧の上のパネルにある[全顧客を一括再計算]を押すと、書き込む文ごとに、書き込み先と件数の確認が出ます。

動きが分かるように、押す前の集計を次の状態にしておきました(集計アプリを手で直して作った状態です)。

  • 新しい顧客 C021 の行が無い
  • 受注がもう無い顧客 C099 の行が残っている(内訳にも 1 行)

確認のダイアログ(ステップ 1 / 4。集計に 23 件)

確認は 4 回出ます。書き込み先は論理アプリの名前で出ます(括弧の中はアプリ番号)。

ステップ 書き込み先 件数 中身
1 / 4 集計 23 件 書き直し 22(C099 は 0 件に)・C021 の追加 1
2 / 4 集計明細 38 件 書き直し 37(C099 の内訳は 0 件に)・C021 の内訳の追加 1
3 / 4 集計 1 件を削除 C099
4 / 4 集計明細 1 件を削除 C099 の内訳

2 回目の確認からは、「ここで取り消しても、前のステップで書いた分は残ります」と出ます。

確認のダイアログ(ステップ 3 / 4。集計から 1 件を削除)

完了のメッセージ(追加 2・更新 59・削除 2)

押す前 押した後
顧客別集計 22 行(C021 が無く、C099 がある) 22 行(C021 が入り、C099 が消えた)
件数の合計 226 件 225 件(受注アプリの件数と一致)
売上の合計 37,679,000 円 37,617,000 円(受注の金額の合計と一致)
顧客別集計明細 37 行 37 行(顧客ごと・担当者ごとの値が受注と一致)
  • 集計日時は、すべての行が押した時刻にそろいます。
  • 書き直した行は上書きなので、レコード番号は変わりません。
  • もう一度押すと「追加 0 / 更新 59 / 削除 0」で、値は変わりません。受注が同じなら、何度押しても件数と売上は同じで、集計日時だけが押した時刻に変わります。消す行が無い回は、ステップ 3・4 の確認は出ずに終わります。
  • 受注アプリ自身には書かないので、完了のダイアログに[画面を更新]は出ません。

自分のアプリで使うとき

SQL の中では、アプリを番号ではなく名前で書いています(LAPP_受注 のような名前。設定の「論理アプリ」で、名前とアプリ番号を結び付けます)。そのため、アプリ番号は論理アプリの表を直すだけで差し替えられます。

ただし、項目は合わせる必要があります。下の「使うアプリと項目」の表にある項目コード・種類・「値の重複を禁止する」の設定が違うと、そのままでは動きません。違うところは、表の下の「変えるところ」を見て SQL を直してください。

使うアプリと項目

受注(ボタンを置くアプリ。論理アプリ「受注」)

項目名 項目コード 種類 メモ
顧客コード 顧客コード 文字列(1行) 集計のキー
担当者 担当者 文字列(1行) 内訳の軸
金額 金額 数値

顧客別集計(論理アプリ「集計」)

項目名 項目コード 種類 メモ
顧客コード 顧客コード 文字列(1行) 値の重複を禁止する(書き込むときの目印)
件数 件数 数値
売上 売上 数値
集計日時 集計日時 日時 押した時刻を入れる

顧客別集計明細(論理アプリ「集計明細」)

項目名 項目コード 種類 メモ
明細キー 明細キー 文字列(1行) 値の重複を禁止する。「顧客コード-担当者」(例 C003-鈴木)
顧客コード 顧客コード 文字列(1行)
担当者 担当者 文字列(1行)
件数 件数 数値
金額 金額 数値

変えるところ

  • 論理アプリの表(「受注」「集計」「集計明細」)を、自分のアプリに向ける
  • 内訳の軸を変える(担当者 → 商品など)ときは、SQL の「担当者」と、明細キーの作り方(CONCAT)をそろえて直す
  • 集計日時の項目が無ければ、SQL の 3) から 集計日時 と @NOW() AS 集計日時 を外す
  • 書き込みの上限(200 件)は、「顧客の数 + 顧客と担当者の組の数」に、消える見込みの行の 2 倍(0 に書き直す分と消す分)を足して、余裕を見て決める(下の「気をつけること」)

気をつけること

  • 書き込む件数は、ふだんは「顧客の数 + 顧客と担当者の組の数」です。 受注の件数ではありません。値が変わっていない行も書き直すためです。受注が無くなった顧客がいる回は、その行を 0 に書き直す分と消す分が足されます。この例では、ふだんの回が 59 件、欠けた行と要らない行を直した回が 63 件(追加 2・更新 59・削除 2)で、書き込みの上限は 200 件にしています。顧客が増えて上限を超えると、超える文を書く前に止まります(それより前の文で書いた分は残ります)。そのときは上限を上げてください。
  • 途中で取り消したり止まったりしても、原因を取り除いてから押し直せば作り直せます。 毎回、受注からまるごと計算し直すためです。止まった場所ごとに、残り得る状態は次のとおりです。
止まった場所 残り得る状態
最初の確認より前(受注の読み取りなど) 何も変わらない(書き込む前に止まる)
ステップ 1(集計) 集計が前のまま、または一部だけ新しい
ステップ 2(集計明細) 集計は新しい。内訳が前のまま、または一部だけ新しい
ステップ 3・4(削除) 受注が無くなった顧客の行が、件数 0 のまま残る

先に全部を 0 にしてから集計する形ではないので、途中で止まっても、受注のある顧客が 0 になることはありません。

  • 受注アプリは全件を読みます。 読み取りの上限(共通設定。既定 10,000 件)を超えると、途中までの件数で集計せずに、エラーで止まります。受注が何年分も溜まるアプリでは、毎回全件を読み直す形は続きません。年で分けて、ふだんは今年だけを作り直します(事例: 年別・顧客別に集計する)。一時テーブルに入れるのは受注の件数ではなく顧客の数なので、一時テーブルの上限には当たりにくい形です。
  • 内訳を別のアプリに分けているのには理由があります。 集計アプリの中のテーブルに内訳を書き戻す形(APPLY)は、書き戻す先の親レコードが 1 件に決まるときしか使えません。全顧客をまとめて書くこの形では、テーブルは書き直せません。集計アプリにテーブルの内訳もある場合は、テーブルだけ前のまま残ります。
  • 集計は、押した時点で読んだ受注から作ります。 実行中に直された受注は、次に押したとき(ふだんの集計がある場合は、その受注を保存したとき)に反映されます。
  • このアプリにはログアプリを設定しています。 実行の記録が残り、別の人が同時に押すと、後から押した人は「ロック中」で止まります(④ 運用編)。
  • 押せる人は絞っていません。 集計アプリを作り直すだけで、受注は変えないためです。絞るなら、設定の「実行を許す人」にユーザーやグループを入れます。
設定の要点
設定 値
種類 アプリ(レコードを選ばずに動く)
出し方 一覧のパネル(区分「受注」)
論理アプリ 受注 = ボタンを置くアプリ、集計 = 顧客別集計、集計明細 = 顧客別集計明細
パラメーター・入力項目 なし
確認 オン(書き込む文ごとに件数を出す)
書き込みの上限 200 件
結果メッセージ 既定(追加・更新・削除の件数)
ログアプリ あり(共通の設定)

確認はオンにしています。書き込む文ごとに件数が出るので、桁違いの件数に書き込む前に気づけます。押すのは、消す行が無い回は 2 回、ある回は 4 回です。押す回数を減らしたいなら確認をオフにできますが、そのときは書き込みの上限が必須です(デモデータを初期化するは、オフにした例です)。

SQL の全文
-- @ksql dialect: 1

-- 1) 集める。受注を顧客別にまとめ、今の集計を「0 の行」として足す
CREATE TEMP TABLE #raw AS
SELECT 顧客コード, COUNT(*) AS 件数, SUM(金額) AS 売上
  FROM LAPP_受注 WHERE 顧客コード <> ''
 GROUP BY 顧客コード
UNION ALL
SELECT 顧客コード, 0 AS 件数, 0 AS 売上
  FROM LAPP_集計;

-- 2) まとめる(kintone には行かない)
CREATE TEMP TABLE #agg AS
SELECT 顧客コード, SUM(件数) AS 件数, SUM(売上) AS 売上
  FROM #raw GROUP BY 顧客コード;

-- 3) 書き込む。受注が無くなった顧客は 0 の行だけが残るので 0 で更新される
UPSERT INTO LAPP_集計 (顧客コード, 件数, 売上, 集計日時)
SELECT 顧客コード, 件数, 売上, @NOW() AS 集計日時
  FROM #agg
ON DUPLICATE (顧客コード);

-- 4) 明細を集める(担当者別)。先にまとめてから連結キーを作る
CREATE TEMP TABLE #draw0 AS
SELECT 顧客コード, 担当者, COUNT(*) AS 件数, SUM(金額) AS 金額
  FROM LAPP_受注 WHERE 顧客コード <> ''
 GROUP BY 顧客コード, 担当者;

CREATE TEMP TABLE #draw AS
SELECT CONCAT(顧客コード, '-', 担当者) AS 明細キー, 顧客コード, 担当者, 件数, 金額
  FROM #draw0
UNION ALL
SELECT 明細キー, 顧客コード, 担当者, 0 AS 件数, 0 AS 金額
  FROM LAPP_集計明細;

-- 5) まとめる
CREATE TEMP TABLE #dagg AS
SELECT 明細キー, 顧客コード, 担当者, SUM(件数) AS 件数, SUM(金額) AS 金額
  FROM #draw GROUP BY 明細キー, 顧客コード, 担当者;

-- 6) 書き込む(既にある行は更新されるのでレコード番号は変わらない)
UPSERT INTO LAPP_集計明細 (明細キー, 顧客コード, 担当者, 件数, 金額)
SELECT 明細キー, 顧客コード, 担当者, 件数, 金額
  FROM #dagg
ON DUPLICATE (明細キー);

-- 7) 0 のまま残った行(もう受注が無い)を消す。消すのは集計のあと
DELETE FROM LAPP_集計 WHERE 件数 = 0;
DELETE FROM LAPP_集計明細 WHERE 件数 = 0;

読むときのポイントです。

  • 「0 の行」を足すのが肝です。 GROUP BY でまとめると、受注が 0 件の顧客は 1 行も返りません。今の集計の行を「件数 0・売上 0」として UNION ALL で混ぜておくと、受注が無くなった顧客も 0 件として結果に出て、3) で 0 に書き直され、7) で消えます。
  • 受注は先に GROUP BY でまとめてから一時テーブルに入れます。 一時テーブルの行が、受注の件数ではなく顧客の数で済みます。
  • 明細キーは、まとめた結果に対して CONCAT で作ります。 そのため、まとめる文(#draw0)と、キーを作って 0 の行を足す文(#draw)の 2 つに分けています。
  • UPSERT … ON DUPLICATE (顧客コード) は、顧客コードが同じ行があれば上書きし、無ければ足します。キーの項目に「値の重複を禁止する」が要るのはこのためです。
  • 消すのは最後で、件数 0 の行だけです。 先に消すと、消したあとで止まったときに行ごと無くなります。DELETE の条件が 件数 = 0 という項目と値の比較なので、kintone の絞り込みにそのまま渡せます(全件を読んでから選ぶことはしません)。
  • @NOW() は押した時刻です。1 回の実行の中では同じ値なので、集計日時がそろいます。
  • WHERE 顧客コード <> '' は、顧客コードが空の受注を集計から外します(空のキーで書き込まないため)。
AI への頼み方

この設定は、AI(Claude Code)に kSQL アクションのオーサリングツール(kact)を使わせて作りました。渡した依頼の文は、次の 1 行だけです。

受注のデータを集計したい

AI が聞き返したこと(アプリと今の設定を調べてから聞かれました)

聞かれたこと 答え
集計の元になる受注アプリ(名前に「受注」を含むアプリが 9 つあったので、候補を絞って聞かれた) 受注
集計した結果をどうしたいか(kSQL アクションで集計アプリへ / その場で数字を見る / 計算式でレコードの中で集計) kSQL アクションで集計アプリへ
集計の軸(顧客別 / 年月別 / 担当者別 / ステータス別。複数可) 顧客別
顧客ごとの集計はもう組んであるので、次に何をするか(全顧客を一括再計算を足す / 使い方を知る / 別の軸 / 今のものを直す) 一括再計算を足す
元にする設定(手元の古い控えか、今の設定を取り直すか) 取り直す

AI が自分で決めたこと

  • 書き込み先は、ふだんの集計(顧客ごと)と同じ 2 つのアプリにする
  • 内訳の軸は担当者にする(集計明細アプリの項目から)
  • 書き込みの上限は 200 件にする(受注 225 件・顧客 22・顧客と担当者の組 40 弱を、自分で数えた)
  • SQL は、資料の標準の形(0 の行を足して集計し、消すのは最後)に合わせる
  • 顧客コードが空の受注は外す
  • 取り込み方は「全置換」にする(今の設定にアクションを 1 件足した、設定全体のファイルなので)

作った後に AI がしたこと

  • 設定の検査(エラー 0。注意 2 件は、どちらも前からある別のアクションのもの)
  • 実行計画の確認。受注の読み取りに「顧客コードが空でない」条件が効いていること、DELETE が 件数 = 0 で絞られて全件の削除になっていないことを見た
  • 取り込み(全置換。アクション 10 件 → 11 件)と実行(この回は、Claude in Chrome で画面を操作させた)、結果の照合(件数の合計 225 が受注と一致)

足りなかったこと(実行の後に、AI と振り返って挙げたこと)

  • 押す前に、集計アプリの中身が入れ替わる(5 行 → 22 行)ことを、数字で伝えなかった(確認のダイアログには出た)
  • 集計に入れたくない受注(試しに入れたものなど)があるかを聞かなかった
  • 集計アプリのテーブルの内訳が、この形では書き直されずに前のまま残ることを、押す前に言わなかった

依頼が 1 行でも、AI はアプリと今の設定を調べてから、決まっていないことだけを聞いてきました。押す前に知りたいこと(何がどれだけ変わるか、前のまま残るものは何か)は、依頼の文に書いておくのが確かです。

詳しい記事

関連記事

機能ごとの記事: 概要 / ① 詳細画面 / ② 一覧 / ③ 集計 / ④ 運用 / ⑤ 事例 / ⑥ イベント / ⑦ オーサリング / ⑧ 請求データ / ⑨ 締めの画面 / ⑩ どこに出すか / ⑪ 多言語 / ⑫ オーサリング改善

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?