Tableau ダッシュボードで「合計が合わない」「フィルターで数が変わる」と悩んだとき、最も多い原因が 集計の粒度(Level of Detail = LOD) の理解不足です。
FIXED 関数は、この“粒度”を明示的に固定して、どんな表示やフィルターでもブレない値を返すための重要な関数です。
この記事では、直感的な例 → 実務ユースケース → LOD関数との違い → フィルター順序 → FAQ → パフォーマンス注意点の順に、豊富な事例とともに解説します。
また、検索需要の高い「複数条件の指定」や「フィルターとの関係」「COUNTDとの組み合わせ」「IF文との併用例」「実務的な落とし穴と対策」まで、現場視点で網羅しています。
FIXED関数とは?── “粒度ブレ”を防ぐ仕組み
たとえば「田中さんの家電購入数」を可視化したいとします。
サブカテゴリで表示すると「1個」なのに、カテゴリ単位で表示すると「2個」になる──そんな現象、見覚えがありませんか?
これは表示の粒度(Detail)によって集計が変わっていることによるものです。
FIXED関数は、集計の粒度を“ロック”することで、こうした不整合を防ぎます。
- 構文:
{ FIXED [ディメンションA], [ディメンションB] : 集計関数 }
- 作用:ビューの表示設定や通常のフィルターよりも“前”に計算される
用語 | 意味(補足) |
---|---|
LOD(粒度) | データの詳細さ・集計単位 |
ディメンション | 集計単位の軸(顧客名・商品名など) |
メジャー | 集計対象(売上・数量など) |
表で確認:FIXEDを使うと何が変わる?
データ例
顧客 | カテゴリ | サブカテゴリ | 個数 |
---|---|---|---|
山田 | 家具 | 椅子 | 1 |
田中 | 家電 | コピー機 | 1 |
田中 | 家電 | 電話機 | 1 |
石田 | 事務用品 | クリップ | 1 |
表A:顧客 × サブカテゴリ(サブカテゴリ粒度)
顧客 | サブカテゴリ | 個数 |
---|---|---|
山田 | 椅子 | 1 |
田中 | コピー機 | 1 |
田中 | 電話機 | 1 |
石田 | クリップ | 1 |
表B:顧客 × カテゴリ(カテゴリ粒度)
顧客 | カテゴリ | 個数 |
---|---|---|
山田 | 家具 | 1 |
田中 | 家電 | 2 |
石田 | 事務用品 | 1 |
FIXEDを使うと:
{ FIXED [顧客], [カテゴリ] : COUNT([サブカテゴリ]) }
このように書くことで、ビューの表示粒度に関係なく、常に「田中 × 家電 = 2」で固定されます。
FIXED関数の実務ユースケース(基礎と応用)
ユースケース | 計算フィールド例 | ポイント |
---|---|---|
全体売上シェア | { FIXED : SUM([売上]) } | 全体合計で割って構成比率算出 |
カテゴリ別ランキング | { FIXED [カテゴリ] : SUM([売上]) } | 表示に依存しないランキング |
トップN商品の維持 | { FIXED [商品] : SUM([売上]) } | フィルター後でも元の上位を保持 |
年別売上・前年比 | { FIXED [年] : SUM([売上]) } | LOOKUPと組み合わせて安定した前年比 |
顧客別累計売上 | { FIXED [顧客] : SUM([売上]) } | 明細レベルでも常に累計 |
月別ユニーク注文件数 | { FIXED [月] : COUNTD([注文ID]) } | ユニーク件数が崩れない |
複数条件(顧客 × 年) | { FIXED [顧客], [年] : SUM([売上]) } | クロス集計時にも一貫性のある計算が可能 |
IF文で条件制御 | { FIXED [顧客] : SUM( IF [状態] = "完了" THEN [売上] END ) } | 条件付き集計に使うと柔軟性が増す |
高度な応用例
- 部門ごとの前年比+全社平均比較:
SUM([売上]) / { FIXED [部門] : LOOKUP(SUM([売上]), -1) }
SUM([売上]) / { FIXED : AVG(LOOKUP(SUM([売上]), -1)) }
- 商品カテゴリ別の売上構成比(年度固定):
{ FIXED [カテゴリ], [年] : SUM([売上]) } / { FIXED [年] : SUM([売上]) }
- エリア内ランキング + 全体順位:
{ FIXED [エリア], [顧客] : RANK(SUM([売上])) }
{ FIXED [顧客] : RANK(SUM([売上])) }
- フィルター後のカウントを維持する:
- 通常フィルターを適用してもFIXEDが影響を受けないように、フィルターをコンテキスト化する:
{ FIXED [顧客] : COUNTD([注文ID]) }
- さらに、IF文と組み合わせることで動的なフィルター動作も可能:
{ FIXED [顧客] : COUNTD( IF [状態] = "完了" THEN [注文ID] END ) }
COUNT / COUNTD との組み合わせ
たとえば「顧客ごとのユニーク注文件数」を求めたい場合は次のように記述します:
{ FIXED [顧客] : COUNTD([注文ID]) }
このように書けば、ビューやフィルターが変わっても、常に安定したカウントが出せます。
INCLUDE / EXCLUDE / FIXED の違い
関数 | 粒度の扱い | 主な用途 |
---|---|---|
FIXED | ビューに関係なくロック | 安定した分母・累計・前年比など |
INCLUDE | ビューより“細かく” | 明細含めた平均や構成比など |
EXCLUDE | ビューより“粗く” | グループ化・カテゴリ別集計など |
FIXED関数とフィルターの順序
FIXED関数は、通常のフィルターよりも“先に”計算されます。
データ → コンテキストフィルター
→ FIXED(ここで集計)
→ 通常のフィルター
→ 表示
つまり、フィルターで除外されてもFIXEDではカウント済みになるということです。
→ フィルターを「コンテキスト」に昇格させれば影響させられます。
よくある質問(FAQ)
Q. IF関数と何が違うの?
A. IFは表示行ベースの条件分岐ですが、FIXEDは集計粒度自体を固定するため、ビューが変わっても安定します。
Q. フィルターしても値が変わらないのは不具合?
A. FIXEDはフィルターより前に計算されるため仕様です。影響させたい場合はコンテキストフィルターを使ってください。
Q. FIXEDでパフォーマンスが落ちる?
A. 複数ディメンションやCOUNTDを含むFIXEDは計算量が増え、特にLive接続では遅延の原因になります。
Q. COUNTDやネストの多用はNG?
A. COUNTDやFIXEDのネストは可能ですが、可読性・速度ともに落ちるため最小限に抑えましょう。
パフォーマンス改善のベストプラクティス
- ディメンション数は最小限に:必要以上の細かさは重くなります
- ネストは避ける:FIXED内に別のFIXEDは避けた方がよい
- Extractに変換する:Live接続で重いと感じたらまず抽出に切り替えましょう
まとめ:FIXED関数は “意図した粒度” を守るための最重要機能
- 表示粒度やフィルターに左右されない、安定した計算が可能
- 前年比・構成比・ランキング・シェア率などの基礎になる
- 他のLOD関数(INCLUDE/EXCLUDE)と使い分けると分析精度が格段に向上
Tableauの分析で「なぜ数が合わないのか?」と悩んだら、まず疑うべきは“粒度”の設計です。
FIXED関数は、数値のブレを防ぎ、分析の信頼性を高める“土台”となる存在です。
Comment