ふくふくHukuhuku Inc.
EP.14dbt 12分公開: 2026-05-10

Semantic Layer / Metrics:指標の正本管理で「数字の食い違い」をなくす

「営業の言う売上」と「経理の言う売上」が違う問題を構造的に解く。dbt の Semantic Layer + MetricFlow で metric を 1 ヶ所に定義、Looker / Tableau / Slack Bot から同じ定義で参照する設計。

#dbt#Semantic Layer#MetricFlow#metrics
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

「売上が部署ごとに違う」は組織あるある。原因は 指標の定義が複数の に散らばっていること。Semantic Layer (MetricFlow ベース)指標を 1 ヶ所に宣言 し、 ツール・ダッシュボード・ Bot 全てから 同じ計算で取得できるようにします。

従来の問題:指標の散逸

あるある: 同じ「売上」が複数の SQL に
SQL
-- 営業のダッシュ: returns を含むSELECT SUM(amount) FROM orders WHERE status = 'completed'
-- 経理のダッシュ: returns を引くSELECT SUM(amount) - SUM(refund) FROM orders WHERE status = 'completed'
-- マーケのダッシュ: キャンペーン期間外を除外SELECT SUM(amount) FROM ordersWHERE status = 'completed'  AND ordered_at NOT BETWEEN '2027-12-15' AND '2027-12-31'
-- → 経営報告で 3 つの数字が出てきて誰も信じない

Semantic Layer の構造

models/semantic/sales.yml
YAML
semantic_models:  - name: orders    description: "注文の semantic model"    model: ref('fct_orders')
    defaults:      agg_time_dimension: ordered_at_day
    entities:      - name: order        type: primary        expr: order_id      - name: customer        type: foreign        expr: customer_id
    dimensions:      - name: ordered_at_day        type: time        type_params:          time_granularity: day        expr: ordered_at      - name: status        type: categorical      - name: region        type: categorical        expr: shipping_region
    measures:      - name: gross_revenue        agg: sum        expr: amount      - name: refund_amount        agg: sum        expr: refund      - name: order_count        agg: count        expr: order_id      - name: net_revenue        agg: sum        expr: amount - COALESCE(refund, 0)
metrics:  # 単純な metric  - name: revenue    label: "売上 (税込・返金後)"    type: simple    type_params:      measure: net_revenue
  # フィルター付き metric  - name: completed_revenue    label: "確定売上"    type: simple    type_params:      measure: net_revenue    filter: |      {{ Dimension('order__status') }} = 'completed'
  # ratio metric (率)  - name: refund_rate    label: "返金率"    type: ratio    type_params:      numerator: refund_amount      denominator: gross_revenue
  # cumulative (累積)  - name: cumulative_revenue    label: "累積売上"    type: cumulative    type_params:      measure: net_revenue      cumulative_type_params:        window: 30 days

MetricFlow で値を取得

コマンドラインから metric query
Bash
# 月次の売上mf query --metrics revenue --group-by metric_time__month
# 地域 × 月次mf query --metrics revenue --group-by region,metric_time__month
# 比較期間mf query --metrics revenue \  --group-by metric_time__month \  --where "{{ TimeDimension('metric_time__day') }} >= '2027-01-01'"
# 複数 metric を一気にmf query --metrics revenue,refund_rate,order_count \  --group-by metric_time__week

BI ツールから接続

ツール接続方法
/ Hex / Hightouch / Modedbt Semantic Layer GraphQL/JDBC コネクタ
LookerLookML から MetricFlow を呼び出し
Streamlit / 自作 BotPython SDK (`dbt-sl-sdk`)
Excel / SheetsMetricFlow GraphQL を叩く middleware
Python SDK で metric を取得
Python
from dbtsl import SemanticLayerClient
client = SemanticLayerClient(    environment_id=12345,    auth_token="dbt_xxx",    host="cloud.getdbt.com",)
# 月次の売上を取得df = client.query(    metrics=['revenue', 'order_count'],    group_by=['metric_time__month'],)print(df)

「指標の正本」を作る効果

  • 部署で数字が一致 ── 同じ metric 定義から参照しているので原理的に一致
  • 変更が全反映 ── 「returns を含めるか」を変えると全ダッシュ・Bot が同時に変わる
  • 監査可能 ── 各 metric の 展開を `mf` CLI で確認可能
  • 学習コスト低 ── アナリストは metric 名だけ知ればよく、 を書かない

Semantic Layer 設計のコツ

項目ベストプラクティス
semantic_modelsfact テーブル 1 つ = 1 semantic_model
entity 命名`customer_id` → entity name は `customer`
measures「集計可能な数値」のみ。前年比などは metric で
metricsビジネス用語そのまま ( / Churn Rate / )
filter事業ルール (deleted フラグ等) は filter で固定
カバレッジ経営層が見る は全部 metric 化を目指す

費用と提供形態

項目dbt Coredbt Cloud Team/Enterprise
MetricFlow CLI (`mf` コマンド)✅ 無料
Semantic Layer (BI 連携)
GraphQL endpoint
BI ツールネイティブコネクタ
Core でも始められる

Core (無料) でも `mf` CLI で metric は使える。BI 接続が必要になったら Cloud にアップグレードする段取りで。

次の話

EP.15 ではアンチパターン 10 選で本シリーズの本編を一旦締めます。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp