> For the complete documentation index, see [llms.txt](https://www.analytics-docs.laplacetec.com/guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.analytics-docs.laplacetec.com/guide/zh-cn/customdashboard/custom/custom_formula.md).

# 自定义公式

{% hint style="info" %}
什么是自定义公式？

自定义公式是在 Laplace 中分析数据时**创建专属计算公式的功能**。与 Excel 或 Google 表格的公式类似，可以组合现有的指标（Measure）和分析维度（Dimension）来创建新的指标。
{% endhint %}

#### 自定义公式可以实现以下功能

1. 比率计算：计算转化率、平均订单金额、单次点击成本等核心指标
2. 目标管理：目标达成率、实际与目标对比、进度追踪
3. 条件分析：等级分类、细分划分
4. 字符串处理：数据清洗、解析、拼接及转换
5. 日期运算：提取年·月·日·周数·星期·季度
6. 复合计算：ROAS、ROI、净利润率等高级指标

## 创建自定义公式 <a href="#create" id="create"></a>

1. 先在图表编辑页面右侧设置面板的「数据」标签中选择数据源和指标。
2. 在「数据」标签 › 「自定义公式」中点击「新公式」。
3. 在「公式名称」中输入将显示在表格和指标列表中的名称。（例：ROAS）
4. 在「公式」中输入指标和函数。将鼠标悬停在左侧列表的函数和「示例」上会显示说明，点击即可插入公式。
5. 在「显示格式」中选择「数字」 · 「币种」 · 「比例」 · 「文本」之一，然后点击「保存」。

   ![自定义公式编辑窗口](https://3137825292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0TsgqYeDkgxa5xtWTHTb%2Fuploads%2Fgit-blob-d842e17a7fccfde44deb18f4bccedcb61e0bb775%2Fcustomdashboard__custom__custom_formula__01.png?alt=media)

{% hint style="info" %}
保存的公式会自动添加到表格中，也会加入「图表」标签的指标列表，可以绘制成图表。创建的公式可以在「自定义公式」列表中进行「编辑公式」 · 「复制」。
{% endhint %}

## 工作原理 <a href="#working_principle" id="working_principle"></a>

Custom Formula 按以下顺序工作：

1. 输入公式

{% hint style="success" %}
例：DIVIDE('revenue', 'order\_count')
{% endhint %}

2. 语法校验\
   检查括号、引号、函数名，以及引用的列是否存在于当前所选的指标·分析维度中
3. 计算\
   用所选的指标和分析维度查询数据后，对查询结果的每一行应用公式，生成新列
4. 显示结果\
   在仪表板上显示计算出的值

## 与 Excel 的对比 <a href="#excel_comparison" id="excel_comparison"></a>

<table><thead><tr><th width="135">类别</th><th>Excel/电子表格</th><th>Laplace Custom Formula</th></tr></thead><tbody><tr><td>单元格引用</td><td>A1, B2:B10</td><td>'revenue', 'order_count'</td></tr><tr><td>除法</td><td>=A1/B1</td><td>DIVIDE('revenue', 'order_count')</td></tr><tr><td>条件语句</td><td>=IF(A1>100, "High", "Low")</td><td>IF('revenue' > 100, "High", "Low")</td></tr><tr><td>文本</td><td>="Hello " &#x26; A1</td><td>CONCAT("Hello ", 'product_name')</td></tr></tbody></table>

{% hint style="info" %}
核心区别

* 列名用\*\*单引号（\`'\`）\*\*括起来：'revenue'
* 字符串值用\*\*双引号（\`"\`）\*\*括起来："已完成"
* 函数名不区分大小写。本文档统一使用大写：DIVIDE
  {% endhint %}

## 基本语法 <a href="#basic_syntax" id="basic_syntax"></a>

### 1. 列引用 <a href="#column_reference" id="column_reference"></a>

'列名'

```
示例
'revenue' - 销售额
'order_count' - 订单数
'product_name' - 商品名称
```

{% hint style="info" %}
本文档中的列名（`'revenue'`、`'order_count'` 等）是用于展示语法的示例。在实际公式中，从输入框自动补全中选择指标·分析维度名称后，该列的键会以单引号括起的形式插入。例如支付金额会以 `'sales'` 插入；使用多个数据源时，会像 `'A__sales'` 这样在前面加上数据源符号。
{% endhint %}

### 2. 数字字面量 <a href="#numeric_literals" id="numeric_literals"></a>

```
100        # 整数
3.14       # 小数
0 - 50     # 负数
```

负数不能直接写成 `-50`，需要像 `0 - 50` 这样用减法表示。

### 3. 字符串字面量 <a href="#string_literals" id="string_literals"></a>

使用双引号。

```
"文本"
"Hello World"
"已完成"
```

### 4. 运算符优先级 <a href="#operator_precedence" id="operator_precedence"></a>

1. **()括号**\
   最先计算。
2. **\* / 乘法、除法**

   先于加法/减法计算
3. **+ - 加法、减法**

   在乘法/除法之后计算
4. **> < >= <= 比较运算符**

   在算术运算之后比较

## 运算符 <a href="#operator" id="operator"></a>

### 算术运算符 <a href="#arithmetic_operators" id="arithmetic_operators"></a>

<table><thead><tr><th width="85">运算符</th><th width="117">说明</th><th>示例</th><th>结果说明</th></tr></thead><tbody><tr><td>+</td><td>加</td><td>'revenue' + 'cost'</td><td>销售额 + 成本</td></tr><tr><td>-</td><td>减</td><td>'revenue' - 'cost'</td><td>净利润</td></tr><tr><td>*</td><td>乘</td><td>'quantity' * 'unit_price'</td><td>总金额</td></tr><tr><td>/</td><td>除</td><td>'revenue' / 'order_count'</td><td>平均订单金额</td></tr></tbody></table>

### 比较运算符 <a href="#comparison_operators" id="comparison_operators"></a>

<table><thead><tr><th width="85">运算符</th><th width="117">说明</th><th>示例</th></tr></thead><tbody><tr><td>=</td><td>等于</td><td>'status' = "已完成"</td></tr><tr><td>&#x3C;></td><td>不等于</td><td>'status' &#x3C;> "已取消"</td></tr><tr><td>></td><td>大于</td><td>'revenue' > 1000</td></tr><tr><td>&#x3C;</td><td>小于</td><td>'revenue' &#x3C; 1000</td></tr><tr><td>>=</td><td>大于等于</td><td>'order_count' >= 2</td></tr><tr><td>&#x3C;=</td><td>小于等于</td><td>'order_count' &#x3C;= 1</td></tr></tbody></table>

### 逻辑函数 <a href="#logical_operators" id="logical_operators"></a>

`AND`、`OR` 不是写在条件之间的运算符，而是作为函数使用。写成 `'revenue' > 1000 AND 'status' = "已完成"` 会报错。

<table><thead><tr><th width="114">函数</th><th width="189">说明</th><th>示例</th></tr></thead><tbody><tr><td>AND</td><td>AND(条件1, 条件2)：两者都为真</td><td>AND('revenue' > 1000, 'status' = "已完成")</td></tr><tr><td>OR</td><td>OR(条件1, 条件2)：任一为真</td><td>OR('category' = "服装", 'category' = "杂货")</td></tr><tr><td>NOT</td><td>NOT(条件)：真假取反</td><td>NOT('revenue' > 1000)</td></tr></tbody></table>

最多可放入两个条件。三个以上时，请像 `AND(条件1, AND(条件2, 条件3))` 这样嵌套使用。

## 函数类型 <a href="#function_types" id="function_types"></a>

{% hint style="info" %}
公式会分别应用于查询结果的每一行。没有合计·平均·计数·最小值·最大值等汇总多行的聚合函数。
{% endhint %}

### 数学函数 <a href="#acceptance_functions" id="acceptance_functions"></a>

<table><thead><tr><th width="126">函数</th><th>语法</th><th width="117">说明</th><th>示例</th></tr></thead><tbody><tr><td>MULTIPLY</td><td>MULTIPLY(a, b)</td><td>乘法</td><td>MULTIPLY('quantity', 'unit_price')</td></tr><tr><td>DIVIDE</td><td>DIVIDE(a, b)</td><td>除法</td><td>DIVIDE('revenue', 'order_count')</td></tr><tr><td>SUBTRACT</td><td>SUBTRACT(a, b)</td><td>减法</td><td>SUBTRACT('revenue', 'cost')</td></tr><tr><td>ABS</td><td>ABS(value)</td><td>绝对值</td><td>ABS('profit_loss')</td></tr><tr><td>FLOOR</td><td>FLOOR(value)</td><td>向下取整</td><td>FLOOR('decimal_value')</td></tr><tr><td>CEIL</td><td>CEIL(value)</td><td>向上取整</td><td>CEIL('decimal_value')</td></tr></tbody></table>

### 条件函数 <a href="#conditional_functions" id="conditional_functions"></a>

<table><thead><tr><th width="128">函数</th><th>语法</th><th width="115">说明</th><th>示例</th></tr></thead><tbody><tr><td>IF</td><td>IF(condition, true_value, false_value)</td><td>条件语句</td><td>IF('revenue' > 1000, "优秀", "普通")</td></tr><tr><td>IFS</td><td>IFS(cond1, val1, cond2, val2, ...)</td><td>多重条件语句。不满足任何条件的行为空值</td><td>IFS('revenue' >= 10000, "最优秀", 'revenue' >= 5000, "优秀")</td></tr><tr><td>COALESCE</td><td>COALESCE(val1, val2, ...)</td><td>替换 NULL</td><td>COALESCE('discount', 0)</td></tr><tr><td>NULLIF</td><td>NULLIF(val1, val2)</td><td>相等时返回 NULL</td><td>NULLIF('order_count', 0)</td></tr></tbody></table>

### 字符串函数 <a href="#string_functions" id="string_functions"></a>

<table><thead><tr><th width="109">函数</th><th>语法</th><th width="116">说明</th><th>示例</th></tr></thead><tbody><tr><td>CONCAT</td><td>CONCAT(str1, str2, ...)</td><td>拼接字符串</td><td>CONCAT('first_name', " ", 'last_name')</td></tr><tr><td>UPPER</td><td>UPPER(text)</td><td>转为大写</td><td>UPPER('product_code')</td></tr><tr><td>LOWER</td><td>LOWER(text)</td><td>转为小写</td><td>LOWER('email')</td></tr><tr><td>TRIM</td><td>TRIM(text)</td><td>去除空格</td><td>TRIM('address')</td></tr><tr><td>LENGTH</td><td>LENGTH(text)</td><td>字符串长度</td><td>LENGTH('product_name')</td></tr><tr><td>SUBSTR</td><td>SUBSTR(text, start, length)</td><td>截取子字符串</td><td>SUBSTR('phone', 1, 3)</td></tr><tr><td>REPLACE</td><td>REPLACE(text, old, new)</td><td>替换字符串</td><td>REPLACE('address', "北京", "Beijing")</td></tr></tbody></table>

### 日期/时间函数 <a href="#datetime_functions" id="datetime_functions"></a>

<table><thead><tr><th width="157">函数</th><th>语法</th><th width="111">说明</th><th>示例</th></tr></thead><tbody><tr><td>NOW</td><td>NOW()</td><td>当前时间</td><td>NOW()</td></tr><tr><td>CURRENT_DATE</td><td>CURRENT_DATE()</td><td>今天日期</td><td>CURRENT_DATE()</td></tr><tr><td>DATE</td><td>DATE(year, month, day)</td><td>生成日期</td><td>DATE(2024, 1, 15)</td></tr><tr><td>YEAR</td><td>YEAR(date)</td><td>提取年份</td><td>YEAR('time_id')</td></tr><tr><td>MONTH</td><td>MONTH(date)</td><td>提取月份</td><td>MONTH('time_id')</td></tr><tr><td>DAY</td><td>DAY(date)</td><td>提取日</td><td>DAY('time_id')</td></tr><tr><td>WEEK</td><td>WEEK(date)</td><td>提取周数</td><td>WEEK('time_id')</td></tr><tr><td>DAY_OF_WEEK</td><td>DAY_OF_WEEK(date)</td><td>星期（1=周日, 2=周一, ..., 7=周六）</td><td>DAY_OF_WEEK('time_id')</td></tr><tr><td>QUARTER</td><td>QUARTER(date)</td><td>季度</td><td>QUARTER('time_id')</td></tr></tbody></table>

### 正则表达式函数 <a href="#regex_functions" id="regex_functions"></a>

<table><thead><tr><th>函数</th><th>语法</th><th width="123">说明</th><th>示例</th></tr></thead><tbody><tr><td>REGEXP_EXTRACT</td><td>REGEXP_EXTRACT(text, pattern)</td><td>正则提取</td><td>REGEXP_EXTRACT('url', "utm_source=([^&#x26;]+)")</td></tr><tr><td>REGEXP_REPLACE</td><td>REGEXP_REPLACE(text, pattern, replacement)</td><td>正则替换</td><td>REGEXP_REPLACE('phone', "[^0-9]", "")</td></tr></tbody></table>

### 类型转换函数 <a href="#type_conversion_functions" id="type_conversion_functions"></a>

<table><thead><tr><th width="93">函数</th><th>语法</th><th width="124">说明</th><th>示例</th></tr></thead><tbody><tr><td>CAST</td><td>CAST(value, "TYPE")</td><td>类型转换</td><td>CAST('amount', "DOUBLE")</td></tr></tbody></table>

{% hint style="warning" %}
`VARCHAR`, `DOUBLE`, `BIGINT`, `BOOLEAN`, `DATE`, `TIMESTAMP`
{% endhint %}

## 示例 <a href="#examples" id="examples"></a>

### 比率计算 <a href="#ratio_calculation" id="ratio_calculation"></a>

<table><thead><tr><th width="141">项目</th><th width="183">计算</th><th width="296">语法</th><th>结果值</th></tr></thead><tbody><tr><td>转化率（CVR）</td><td>(订单数 ÷ 点击数) × 100</td><td>DIVIDE('order_count' * 100, 'clicks')</td><td>5.0%</td></tr><tr><td>平均订单金额（AOV）</td><td>销售额 ÷ 订单数</td><td>DIVIDE('revenue', 'order_count')</td><td>₩ 50,000</td></tr><tr><td>单次点击成本（CPC）</td><td>广告费 ÷ 点击数</td><td>DIVIDE('ad_cost', 'clicks')</td><td>₩ 200</td></tr><tr><td>ROAS</td><td>(销售额 ÷ 广告费) × 100</td><td>DIVIDE('revenue' * 100, 'ad_cost')</td><td>500%</td></tr></tbody></table>

### 目标管理 <a href="#goal_management" id="goal_management"></a>

<table><thead><tr><th width="141">项目</th><th width="183">计算</th><th width="296">语法</th><th>结果值</th></tr></thead><tbody><tr><td>目标达成率</td><td>(实际销售额 ÷ 目标销售额) × 100</td><td>DIVIDE('revenue' * 100, 'target_revenue')</td><td>85%</td></tr><tr><td>目标达成等级</td><td>S (130%↑) / A (110%↑) / B (90%↑) / C (90%↓)</td><td>IF(DIVIDE('revenue', 'target_revenue') >= 1.3, "S级",<br>IF(DIVIDE('revenue', 'target_revenue') >= 1.1, "A级",<br>IF(DIVIDE('revenue', 'target_revenue') >= 0.9, "B级",<br>"C级")))</td><td>A级</td></tr><tr><td>与目标的差额</td><td>实际销售额 - 目标销售额</td><td>SUBTRACT('revenue', 'target_revenue')</td><td>+ ₩ 2,000,000</td></tr><tr><td>日均所需销售额</td><td>(目标 - 当前) ÷ 剩余天数</td><td>DIVIDE( SUBTRACT('target_revenue', 'current_revenue'), 'days_remaining' )</td><td>₩ 1,200,000/天</td></tr></tbody></table>

### 顾客细分 <a href="#customer_segmentation" id="customer_segmentation"></a>

<table><thead><tr><th width="141">项目</th><th width="183">计算</th><th width="296">语法</th><th>结果值</th></tr></thead><tbody><tr><td>顾客等级分类</td><td>白金 (50K↑) / 黄金 (20K↑) / 白银 (10K↑) / 青铜</td><td>IF('revenue' >= 50000, "白金",<br>IF('revenue' >= 20000, "黄金",<br>IF('revenue' >= 10000, "白银",<br>"青铜")))</td><td></td></tr><tr><td>周末/工作日区分</td><td>按星期编号判断周末</td><td>IF(OR(DAY_OF_WEEK('time_id') = 1, DAY_OF_WEEK('time_id') = 7), "周末", "工作日")</td><td></td></tr><tr><td>新客/复购顾客</td><td>按订单次数划分顾客类型</td><td>IF('order_count' > 1, "复购", "新客")</td><td></td></tr><tr><td>年龄段分类</td><td>35 岁 → "30多岁"</td><td>CONCAT(<br>CAST(FLOOR('age' / 10) * 10, "VARCHAR"),<br>"多岁"<br>)</td><td></td></tr></tbody></table>

## 技巧与注意事项 <a href="#tips_cautions" id="tips_cautions"></a>

### 建议 <a href="#recommendations" id="recommendations"></a>

{% hint style="success" %}

1. 用括号明确优先级

复杂的公式请用括号明确表达意图。

```
❌ 'a' + 'b' * 'c' / 'd'
✅ 'a' + (('b' * 'c') / 'd')
```

{% endhint %}

{% hint style="success" %}
2\. 除以 0 会自动处理

`DIVIDE` 和 `/` 在分母为 0 时返回空值而不是报错。无需另外检查 0。

但如果对除法结果再进行乘法或加法，空值会变为 0。像百分比这样需要乘以倍数时，请先乘到分子上。

```
DIVIDE('revenue', 'order_count')         (订单数为 0 的行为空值)
DIVIDE('order_count' * 100, 'clicks')    (点击数为 0 的行为空值)
DIVIDE('order_count', 'clicks') * 100    (点击数为 0 的行为 0)
```

{% endhint %}

{% hint style="success" %}
3\. 确认类型一致

比较/运算时请使用相同类型。

```
❌ 'revenue' > "1000"   (数字 vs 字符串)
✅ 'revenue' > 1000     (数字 vs 数字)
```

{% endhint %}

### 注意事项 <a href="#warnings" id="warnings"></a>

| 项目     | ❌ 错误示例              | ✅ 正确示例    |
| ------ | ------------------- | --------- |
| 列引用    | revenue 或 "revenue" | 'revenue' |
| 字符串    | '已完成'               | "已完成"     |
| 列名拼写错误 | 'revenu'            | 'revenue' |

{% hint style="danger" %}
**禁止循环引用**

公式引用自身时会报错。可以引用其他公式，但应避免循环引用。
{% endhint %}

## 常见问题（FAQ）

<details>

<summary>Q. 公式不起作用，该怎么办？</summary>

**检查清单：**

1. 是否只使用了本文档函数表中的函数？
2. 列名是否用单引号括起来？（`'revenue'`）
3. 字符串是否用双引号括起来？（`"已完成"`）
4. 括号是否正确闭合？

</details>

<details>

<summary>Q. 可以引用其他公式吗？</summary>

**可以！**\
\
先创建“平均订单金额”公式：\
`DIVIDE('revenue', 'order_count')`\
\
然后在其他公式中引用：\
`IF('平均订单金额' > 50000, "VIP", "普通")`\
\
⚠️ \*\*注意：\*\*禁止循环引用。

</details>

<details>

<summary>Q. 如何提升公式性能？</summary>

**建议：**

1. 尽量减少复杂的正则表达式。
2. 只筛选需要的数据来使用。

</details>

## 联系专属经理 <a href="#contact" id="contact"></a>

使用自定义公式时遇到困难吗？

请通过下方的咨询页面或邮件与我们联系。负责经理将为您提供帮助。

> 💬 [在官网咨询](https://www.analytics.laplacetec.com/contact)

**邮件咨询：** [**product@laplacetec.com**](mailto:product@laplacetec.com)
