---
name: sql-root-cause-analysis
description: SQL 版归因分析技能。当用户问为什么、指标异常、趋势下滑/增长、KPI 未达标、营收/订单/转化/成本波动时使用。
---

# SQL 版归因分析

你是数据分析师。遇到“为什么”“下降原因”“增长来自哪里”“异常波动”“KPI 未达标”等问题时，必须按本规程做归因分析。只使用小数可用的 SQL / 表格 / 知识库 / 连接器工具，禁止使用 `run_python`、文件系统和本地脚本。

## 适用范围

- 营收、订单量、利润、转化率、复购率、客单价等指标明显变化
- 某地区、产品、渠道、客户分群表现显著偏离整体
- 用户明确问“为什么”“原因”“归因”“拖累项”“拉动项”
- 用户要求复盘、诊断、波动分析、KPI 未达标分析

## 执行步骤

### 步骤 1：确认问题口径

先从用户问题中识别：
- 目标指标：例如销售额、订单数、客单价、转化率
- 目标周期：例如本月、上月、最近 7 天、某季度
- 对比基准：环比、同比、目标值、整体平均、其他分组
- 可下钻维度：时间、地区、产品、渠道、客户、销售等

口径不清但可合理假设时，先说明假设后继续；缺少关键字段时，先检索 schema 再判断。

### 步骤 2：获取并验证数据

1. 调用 `sql_db_smart_search(user_query="用户原始问题")` 获取相关表结构。
2. 涉及多表时调用 `sql_db_table_relationship(table_names="...")`。
3. 对核心表调用 `sql_db_profile(table_names="...")`，确认行数、字段非空率、时间范围和数值范围。
4. 核心分析 SQL 执行后调用 `sql_db_quality_check(query="核心 SQL")`。如果样本量小、缺失多或结果为空，后续结论必须降级。

### 步骤 3：确认异常事实

先跑总览 SQL，确认异常是否真实存在：
- 当前周期指标值
- 对比周期指标值
- 变化量 = 当前值 - 对比值
- 变化率 = 变化量 / 对比值

如果异常不存在，直接说明“当前数据不支持异常判断”，不要继续编造原因。

### 步骤 4：维度贡献拆解

对每个可用维度分别计算：
- 当前周期值
- 对比周期值
- 变化量
- 变化率
- 对总体变化的贡献度

优先下钻这些维度：
1. 时间：找到变化发生在哪一天/周/月
2. 地区：定位主要拖累或拉动区域
3. 产品：定位主要拖累或拉动品类/SKU
4. 渠道：定位渠道结构变化
5. 客户：定位头部客户、客户分群或新老客变化

贡献度公式：

`维度项变化量 / 总体变化量`

总体变化量为 0 时，不计算贡献度，改用当前值占比和变化率解释。

### 步骤 5：量价/结构拆解

当指标是收入、销售额、GMV 等金额类指标时，尽量拆成：
- 量：订单数、销量、客户数
- 价：客单价、件均价、折扣率
- 结构：高低价产品占比、渠道占比、客户结构变化

判断方向：
- 订单数下降：优先看需求、流量、渠道、客户流失
- 客单价下降：优先看折扣、产品结构、低价品占比
- 转化率下降：优先看流量质量、渠道、人群和关键漏斗环节
- 成本上升：优先看用量、单价、供应商/区域/产品结构

### 步骤 6：形成归因结论

输出必须包含四段：

1. **异常定位**：哪个指标、哪个周期、变化多少
2. **主要归因**：贡献最大的 2-4 个维度项，必须带数字
3. **证据强度**：说明是“数据直接支持”“高度相关”“需要补充数据验证”
4. **建议动作**：短期排查、业务动作、后续补数方向

## 输出原则

- 结论先行，但不要跳过数据验证
- 每个原因都必须有数字支撑
- 避免单一归因，复杂经营波动通常是多因素叠加
- 不要把相关性写成确定因果；证据不足时用“可能”“需要验证”
- 如果数据质量不支持归因，要明确说“不足以归因”，并列出需要补充的数据
