Tableauで注文データに別の表を追加したら、売上が2倍になった。JOINではなくリレーションシップを設定したのに、集計値が想定と違う。
最初に確認したいのは、[データ ソース]で表をどう組み合わせたかです。物理結合は一致する行を組み合わせて一つの表を作ります。一方、リレーションシップは表を個別に保持し、ビューで使うフィールドに応じてTableauがクエリを作ります。両者では「データが重複している」ときの調べ方が異なります。
この記事でわかること
- 物理結合とリレーションシップで数字が変わる仕組み
- 元データ・結合結果・ビューのどこを確認するか
- 原因に応じた修正方法と、修正後の検算方法
結論:まず物理結合かリレーションシップかを確認する
Tableauの[データ ソース]画面で、テーブル間のつながり方を確認してください。通常、最初に表示される論理レイヤーで表同士を関連付けるのがリレーションシップです。論理テーブルを開いた内側で設定するのが物理結合です。
| 組み合わせ方 | データの扱い | 数字が増えたときの主な確認点 |
|---|---|---|
| 物理結合 | 一致する行を組み合わせた表を作る | 結合キーの重複、条件不足、結合後の行数 |
| リレーションシップ | 表を個別に保持し、ビューに応じて問い合わせる | 関係に使うキー、カーディナリティ、参照整合性、ビューの集計単位 |
物理結合なら「どの元の行が何行になったか」から調べます。 リレーションシップなら「元テーブルそれぞれの値は正しいか」「どのフィールドを同じビューに置いたとき値が変わるか」から調べます。
リレーションシップは、異なる詳細レベルの表を扱うための仕組みです。ただし、元データの誤った重複や、実データと合わない関係設定まで自動的に修正するものではありません。
具体例:注文に対応履歴をJOINすると売上が増える
まず、次の2つの表を考えます。
注文:1行=1注文
| 注文ID | 売上 |
|---|---|
| 101 | 100 |
| 102 | 200 |
注文の売上合計は300です。
対応履歴:1行=1回の対応
| 注文ID | 対応 |
|---|---|
| 101 | メール |
| 101 | 電話 |
| 102 | メール |
注文IDで物理結合すると、結果は次のようになります。
| 注文ID | 売上 | 対応 |
|---|---|---|
| 101 | 100 | メール |
| 101 | 100 | 電話 |
| 102 | 200 | メール |
結合結果に対して売上を足せば、100+100+200=400です。注文101が二重登録されたとは限りません。対応履歴に注文101が2行あり、注文の売上100がそれぞれの行に付いた結果です。
この違いを見落としやすいのは、「注文の売上」と「対応履歴」が異なる粒度のデータだからです。注文ごとの売上が欲しいのか、対応ごとの情報が欲しいのかを先に決める必要があります。
まずここから確認:重複が生じた場所を探す
以下の順に確認すると、原因を絞れます。
| 順番 | 確認すること | 見つかること |
|---|---|---|
| 1 | 各テーブルの「1行が表すもの」 | 注文単位と明細・履歴単位の違い |
| 2 | 各テーブルでキーごとの行数 | 元から複数行あるキー |
| 3 | [データ ソース]での組み合わせ方 | 物理結合かリレーションシップか |
| 4 | 結合キーと、物理結合なら結合タイプ | 条件不足や未一致行の扱い |
| 5 | 結合前後、または各表単体と複数表のビューを比較 | 数字が変わる段階 |
| 6 | 注文IDなど小さな単位で再計算 | 総額の差を生んだ具体的な行 |
物理結合を使っているなら、Tableauの[データ ソース]のデータグリッドで結合結果を確認します。
元データをSQLで確認できる場合は、結合先に同じキーが何行あるか調べると早く切り分けられます。
SELECT order_id, COUNT(*) AS rows_per_order
FROM order_events
GROUP BY order_id
HAVING COUNT(*) > 1;
このSQLで注文101が2行と分かっても、履歴の二重登録とは限りません。「1注文に複数回の対応がある」という正しいデータの可能性があります。
SQLで重複キーと該当明細を確認する方法は、こちらで解説しています。
物理結合で重複する主な原因と直し方
原因1:結合先が1キーにつき複数行ある
問題: 結合後、注文IDごとの行数と売上合計が増える。
なぜ起きるか: 左表の1行に右表の複数行が一致するためです。対応履歴や注文明細などでは、複数行が正常なこともあります。
確認箇所: 両方の表で結合キーごとの行数を調べ、[データ ソース]のデータグリッドで具体的な注文IDの結合結果を見ます。
修正方法: 注文ごとの対応件数が必要なら、対応履歴を注文単位に集計してから結合します。対応の存在だけが必要なら、元データ側で存在判定を作る方法もあります。どちらも、欲しい指標の単位に合わせて選びます。
結合キーの重複、1対多・多対多の見分け方は、SQLの例を使った記事でも確認できます。
原因2:結合条件が足りない
問題: 特定の店舗や月だけ、売上・件数が大きく増える。
なぜ起きるか: 本来は「店舗IDと対象月」で結ぶべき表を、「店舗ID」だけで結ぶと、同じ店舗の複数月が一致します。
確認箇所: [データ ソース]で物理結合の条件を開き、業務上の一意な組み合わせと比べます。店舗ID・対象月ごとの行数も元データで確認します。
修正方法: 対応する列を結合条件に追加します。ただし、両表で「月」が同じ意味と形式かを確認してください。片方が計上月、もう片方が出荷月なら、列を追加するだけでは正しい対応になりません。
原因3:集計対象の列を、増えた行の上でSUMしている
問題: 対応件数は正しいのに、注文売上だけ大きい。
なぜ起きるか: 結合で増えた各行に注文売上が繰り返され、その売上列をSUMしているためです。
確認箇所: Tableauのビューに注文IDと売上を置き、結合前の注文売上と注文ID別に比較します。表示の集計方法がSUMかも確認します。
修正方法: 元の表で注文売上を集計する、結合先を注文単位にまとめる、または分析内容に適したリレーションシップを検討します。MINやAVGで表示上の値を合わせる方法もありますが、業務上の指標に合う場合だけ使ってください。
DISTINCTやCOUNTDで総額・件数だけを合わせて終了しないことも大切です。結合条件やデータの粒度が間違ったままなら、別の集計軸で再び数字がずれる可能性があります。
リレーションシップで数字が合わないときの確認方法
物理結合とは異なり、リレーションシップは表を事前に一つの平坦な表へ統合しません。Tableauはビューで使うフィールドをもとにクエリを作り、表の詳細レベルを考慮して集計します。そのため、リレーションシップを使っているだけで、物理結合と同じ行の増加が常に起きるわけではありません。
それでも値がおかしい場合は、次の順で確認します。
1. 表ごとの値は正しいか
注文表の売上だけを置いた検証用シートと、対応履歴表の件数だけを置いた検証用シートを作ります。まず各表単体の値を元データと比べ、その後、両表のフィールドを同じビューに置いて比較します。
各表単体ですでに違うなら、元データ、フィルター、集計方法を調べます。組み合わせたときだけ違うなら、関係に使うフィールドや設定を調べます。
2. 関係に使うキーは正しいか
[データ ソース]でテーブル間の線を確認し、注文IDだけで対応するのか、店舗や期間なども必要かを元データの定義と比べます。同じ名前のフィールドでも、両表で意味が違う可能性があります。
3. カーディナリティを実データに合わせているか
キーが一意でないのに、リレーションシップのパフォーマンス オプションで[One (1)]等を選ぶと、重複した集計値が表示される場合があります。一意か分からないキーは、確認せずに[One (1)]と決めないでください。
同じ設定画面では、表同士のレコードがすべて一致するかという参照整合性も扱います。「すべて一致する」と設定する前に、実際に未一致のキーがないか確認してください。
カーディナリティとは、2つの表を結ぶキーについて、片方の1件に対して、もう片方が何件対応するかを表す関係(1対1、1対多、多対多)です。
JOINとリレーションシップ、どちらに直せばよい?
数字が合わないからといって、すべての物理結合をリレーションシップに変更する必要はありません。目的に合わせて判断します。
| やりたいこと | 検討する方法 | 確認すべきこと |
|---|---|---|
| 注文と対応履歴を、それぞれの単位で集計したい | リレーションシップ | 関係キーと各表の粒度 |
| 注文ごとの対応件数を1列として付けたい | 対応履歴を注文単位に集計してから結合 | 集計後に注文IDが一意か |
| 対応1件ごとの一覧に注文情報を付けたい | 物理結合 | 注文売上を対応行ごとに合計しないか |
| 一致しない行を意図的に除外したい | 要件に合う結合タイプを選ぶ | 除外したIDと件数 |
Tableauで数字が合わない原因を、集計・フィルター・抽出も含めて広く確認したい場合は、総合記事を参照してください。
初学者が詰まりやすい3つのポイント
「同じ注文IDが2行ある=誤った重複」と判断する
原因: 注文表と、1注文に複数行ある対応履歴・明細表の単位を混同する。
なぜ起きるか: 同じ注文IDが複数行に現れても、各行が別の対応や商品を表している場合があるため。
対策: 各表の「1行=何か」を先に確認し、どのキーの組み合わせが一意であるべきか決める。
リレーションシップを使えば必ず正しくなると考える
原因: 関係キーや[One (1)]の設定を検証しない。
なぜ起きるか: Tableauが各表の詳細レベルを考慮しても、指定したキーや一意性の前提が実データと違えば、期待する集計にならないため。
対策: 各表単体と組み合わせたビューを比較し、キーごとの行数とパフォーマンス オプションを確認する。
COUNTDで注文数が合ったので、売上も正しいと判断する
原因: 注文IDの異なる値の数だけで、結合結果を検算する。
なぜ起きるか: COUNTD(注文ID)が期待値でも、同じ注文の売上が複数行に繰り返され、SUM(売上)は増える場合があるため。
対策: 注文IDの数に加えて、注文ID別の行数と売上、全体の売上合計を確認する。
それでも直らないときの検算手順
総額だけで原因が分からなければ、差がある注文IDや店舗・月を数件探してください。
- 各元テーブルから、そのIDの行を取得する。
- 物理結合なら、[データ ソース]のデータ グリッドで該当IDの結合結果を見る。
- リレーションシップなら、各表単体の検証用シートと、両表のフィールドを置いたシートを比較する。
- そのIDで期待する行数・売上・対応件数を書き出す。
- 修正後に対象ID、月別・店舗別の内訳、総額を再計算する。
総額だけが一致しても完了とはしないことが現場では重要です。ある注文で売上が増え、別の注文が消えていれば、総額が偶然近づくことがあります。また、表の組み合わせ方を変えると既存のシートにも影響し得るため、変更したデータソースを使う主要なビューを再確認してください。
まとめ
Tableauでテーブルを組み合わせた後にデータが重複して見えたら、まず物理結合かリレーションシップかを確認します。
- 物理結合: 結合キーごとの行数、条件、結合後の明細を調べる。
- リレーションシップ: 各表単体と複数表のビューを比較し、関係キーと[One (1)]などの設定を調べる。
- どちらの場合も: 売上や件数を、期待する「1行の単位」に合わせて検算する。
正しい修正方法は、重複して見える行が不要な二重登録なのか、正しい複数明細なのかで変わります。その判断をしてから、集計方法やデータモデルを直しましょう。
次に読む記事
SQLで結合キーの重複と粒度を調べたい場合はこちらです。
重複したキーと元の明細を見つけたい場合はこちらです。
Tableauの数字が合わない原因を広く確認したい場合はこちらです。
Tableauのデータ接続や基本操作から整理したい場合はこちらです。



入門で伝わるグラフを作れる人になる|データ・AI学習ロードマップ-160x90.png)

