先把这句话讲清楚: Tableau 的聚合计算最大的问题不是“算不出来”, 而是“你以为你在算 A, 但它其实在算 B”. 下面这份 checklist 专门用来避免这种错觉.
1. 先确认: 你在算的是“行级”还是“聚合级”
Tableau 的计算大体分两类:
- 行级计算: 每一行先算出结果, 再被聚合. 例如
IF [Amount] > 0 THEN 1 END. - 聚合级计算: 先聚合, 再参与计算. 例如
SUM([Amount]) / SUM([Quantity]).
常见坑:
SUM([Amount] / [Quantity])和SUM([Amount]) / SUM([Quantity])完全不是一回事.- 前者是“每行单价求和”.
- 后者是“加权平均单价”.
2. 粒度 (Level of Detail) 决定你算出来的世界是什么
你在视图里放了什么维度, 就在定义这张表的“颗粒度”. 颗粒度一变, 你所有聚合都跟着变.
尤其注意:
- 你加了一个 Breakdown 维度 (比如 Customer, Region), 你以为只是“拆开看看”, 但实际上 Tableau 是在 重新分组.
- 只要分组变了,
COUNTD,AVG,MIN/MAX, 甚至某些SUM的解释都可能变.
3. 为什么 COUNTD 在有 breakdown 时, total 会变
你页面里这个现象最典型:
- Breakdown 后 total 变成 66.
- 不 breakdown 时 total 是 65.
这是因为 Tableau 的 Total 并不一定等于每个行/每个 pane 的值相加.
- 对
SUM来说, 大多数时候 total = 加总, 比较直觉. - 对
COUNTD来说, total 通常是“在更高层级重新算一遍 COUNTD”. - 行里每个分组各自
COUNTD. - Total 是在“所有分组的并集”上再
COUNTD一次. - 如果某个 ID 同时出现在多个分组里, 你把每个分组的
COUNTD相加会重复计数.
所以: 你看到 total 比不 breakdown 的结果更大, 往往意味着 你的 total 在做的是另一种逻辑 (比如 pane total 触发了不同的计算路径, 或者你在算的是每个 pane 的 distinct 再汇总, 而不是整体 distinct).
4. “总计”的计算方式要明确指定, 不要赌 Tableau 的默认
很多人误判就是因为默认总计策略不符合直觉.
建议的做法:
- 先问自己一句话: 我想要的 total, 到底是“整体重算一次”, 还是“把每个分组结果加起来”?
- 如果你想要“整体重算一次”,
COUNTD的默认总计往往更接近你要的. - 如果你想要“把分组结果加起来”, 那你可能需要用 LOD / FIXED / 或者先在更细粒度做标记, 再 SUM.
5. 避免在一个计算里混用聚合和非聚合 (Aggregate vs Non-aggregate)
当你写类似:
IF [Flag] = 1 THEN SUM([Sales]) END
Tableau 会直接报错, 因为你在一个表达式里混了行级字段和聚合.
处理方式通常有 3 种:
- 把行级条件也聚合化:
IF MIN([Flag]) = 1 THEN SUM([Sales]) END(注意这会改变语义). - 把聚合拆出去, 先做行级标记, 再聚合.
- 用 LOD (例如 FIXED) 明确你要的粒度.
6. LOD 不是万能药, 但它能把“粒度”写死
当你希望一个数 不随视图维度变化 (也就是不随 breakdown 变化), LOD 是最直接的工具.
典型场景:
- 你想要“每个客户的 distinct 数”, 但无论视图怎么拆, 都希望它稳定.
- 你想要“全局 distinct 客户数”, 并且希望在任何 breakdown 下都保持一致.
一句话: LOD 的价值是把“按谁分组”从视图里拿出来, 写进公式里.
7. 聚合的结果对 Null, 重复行, join 方式极度敏感
聚合不只是数学问题, 还是数据结构问题.
COUNT不数 null,COUNTD也不数 null.- join 一旦造成行数膨胀 (例如一对多),
SUM([Sales])会被重复累加.
如果你发现:
- Breakdown 后数变大.
- 加一个维度后 SUM 翻倍.
优先怀疑:
- join 粒度不一致.
- 数据源存在重复行.
- 你在视图里引入了导致重复的维度.
8. 一个实用的自检方法: 把“分母/分子”拆成两张卡
如果你在算比率或平均值, 最好把组成部分拆开摆在视图上:
SUM([Amount])SUM([Quantity])SUM([Amount]) / SUM([Quantity])
这样你一眼就能看出粒度变化到底影响了哪一段.
小结
聚合计算的核心不是记函数, 而是两件事:
- 你想要的“粒度”是什么.
- Total 到底是“重算一次”还是“加总结果”.
只要你把这两件事讲清楚, 90% 的聚合坑都能躲开.