AI分析の数字を確かめる:集計の重複・欠損・条件を照合する

AIが生成したSQLやグラフを使う前に、一行の単位、表の結合、空欄、対象期間を確認する。架空の5注文で集計の違いを再現し、確認リストを持ち帰れます。

編集:株式会社世良。更新:2026-09-15。順位・点数評価なし。

このガイドの対象:AIやBIの分析結果を業務判断へ使う担当者と、集計を作るデータ担当者

読み終えて持ち帰るもの:集計の前提・元データ・照合結果をまとめた確認メモと、再現用の小さなSQL

公開された公式資料と編集部の整理に基づくガイドです。各社の紹介と、当社が提案する確認手順を分けて記載しています。製品検証・受講・全編実読を行ったレビューではありません。

質問を、集計できる条件にする

『先月の売上は?』には複数の解釈があります。受注額か請求額か、税・取消・返金を含むか、どの時刻で月を区切るかを先に書きます。AIの回答が自然でも、違う定義を集計していればそのまま判断には使えません。

指標、対象期間、対象者・部門、除外条件、元データの更新時刻を一組にします。分析結果を表示した時刻と、データが最後に取り込まれた時刻も分けて残します。

一行が何を表すかを、結合の前後で確かめる

注文の表は一行が一注文、明細の表は一行が一商品など、表によって単位が違います。一つの注文に複数の明細を結び付けると、注文金額が複数行へ現れます。その列をそのまま足すと重複する場合があります。

行数だけでなく注文IDの種類数を照合します。金額の重複を除くだけでは、たまたま同額の別注文も一つになってしまいます。明細に行がない注文を残すかどうかも、分析対象の定義に合わせて決めます。

空欄・ゼロ・対象外を分ける

金額0円と、金額が未取得で分からない状態は別です。下の例ではNULLを未取得として定義しています。合計が表示されても、未取得の注文があれば全体の金額が確定したとは言えません。分かっている分の合計と、未取得件数を併記します。

対象外にした行は、除外理由と件数を残します。エラーがないこと、グラフが描けること、全対象の集計が確認できたことを分けて判断します。

小さな答え合わせから、実データの確認へ進む

複数明細、同額の別注文、結合先なし、ゼロ、未取得を含む小さな例を作り、手計算と処理結果を照合します。その後で、実データの件数、合計、部門別の内訳を元システムへ戻って確認します。

確認済みのSQL・指標定義・データの版・実行日時・判断した人を残します。元データや定義を更新したときに同じ例を再確認すると、変化の理由を追いやすくなります。この教材だけで、各製品や自社分析の精度が検証済みになるわけではありません。

5つの注文で、集計の違いを見てみる

編集部が作成した架空データをSQLiteで実行して確認した教材です。特定製品やAIの出力・性能を測定した結果ではありません。金額の単位は円、NULLは金額未取得と定義します。

問い:全5注文について、分かっている金額の合計と、未取得の件数を出してください。

注文A:100円。明細が2行ある。

注文B:100円。Aと同額の別注文。

注文C:50円。明細がまだない。

注文D:0円。0円と分かっている。

注文E:金額未取得(NULL)。金額未取得・明細なし。

明細A-1:注文A。

明細A-2:注文A。

明細B-1:注文B。

明細D-1:注文D。

LEFT JOIN後は6行。Aは2行、B・C・D・Eは各1行です。

結合後の金額を足す:350円

Aを2回数える

LEFT JOINで明細をつなぐと6行になります。Aの100円が2行に現れるため、注文の部分合計より100円多くなります。

SELECT SUM(o.amount) AS amount FROM orders o LEFT JOIN order_items i ON i.order_id = o.order_id;

同じ金額を一つにする:150円

同額の別注文も消える

SUM(DISTINCT 金額)は値の重複を除きます。AとBは別の注文でも同じ100円なので一つになり、100円・50円・0円の計150円になります。

SELECT SUM(DISTINCT o.amount) AS amount FROM orders o LEFT JOIN order_items i ON i.order_id = o.order_id;

明細がある行だけ足す:300円

重複と対象漏れが残る

INNER JOINではC・Eが対象から落ちます。一方でAの重複は残るため、Aの100円を2回、Bの100円、Dの0円を足して300円になります。

SELECT SUM(o.amount) AS amount FROM orders o INNER JOIN order_items i ON i.order_id = o.order_id;

注文の表から一度ずつ足す:250円

部分合計と未取得件数を出す

この問いには明細の条件がないため、注文の表から集計します。金額のある4件の合計250円と未取得1件を分けます。全体の金額が確定したという意味ではありません。

SELECT SUM(amount) AS known_amount, COUNT(*) AS order_count, COUNT(amount) AS known_count, COUNT(*) - COUNT(amount) AS missing_count FROM orders;

この例で確認できたこと

答えは、金額がある4注文の部分合計250円と、金額未取得1件です。全5注文の総額は未確定です。明細のない注文も対象に含めます。

結合に必要な条件がある場合は、対象の注文IDを先に絞るなど、一注文を一度だけ数える設計が必要です。全件で金額がNULLの場合、SUMはNULLを返します。これも0円とは区別します。

確認した根拠を、残しましょう。

入力は送信されません。ページを離れると消えるため、必要な記録を保存してください。確認済みの数は、導入の適否や品質を表す点数ではありません。

指標と期間の意味が決まっているか 確認資料の例:受注・請求、税・取消・返金、締め時刻、除外条件の定義

結合の前後で一行の単位を説明できるか 確認資料の例:結合キー、一意性、元の件数、結合後の行数とID数

空欄をゼロと混ぜていないか 確認資料の例:未取得・ゼロ・対象外の件数と、分かっている分の合計

条件の違う小さな例で照合したか 確認資料の例:複数明細、同額の別注文、未一致、欠損を含む入力と期待値

実データでも元の記録へ戻って確認したか 確認資料の例:元システムとの内訳比較、更新日時、確認担当と未解決点

出典と確認範囲

リンク先は提供元の公式情報です。このガイド全体や当社の手順が、提供元に承認されているという意味ではありません。

Looker公式:Understanding symmetric aggregates:一対多の結合で金額が重複する問題と、一意なキー・関係の定義を参照。以下の入力データとSQLは編集部が別途作成した教材です。

SQLite公式:Built-in Aggregate Functions:SUM・COUNT・DISTINCTとNULLの扱いを確認。掲載する演習はSQLiteで実行して照合しており、各社製品のAI出力を実測したものではありません。

関連ページ


株式会社世良(Sera, Inc.)/ お問い合わせ: info@sera-inc.co.jp