Search

5️⃣

聚合计算的注意事项

先把这句话讲清楚: 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 种:

  1. 把行级条件也聚合化: IF MIN([Flag]) = 1 THEN SUM([Sales]) END (注意这会改变语义).
  2. 把聚合拆出去, 先做行级标记, 再聚合.
  3. 用 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])

这样你一眼就能看出粒度变化到底影响了哪一段.

小结

聚合计算的核心不是记函数, 而是两件事:

  1. 你想要的“粒度”是什么.
  2. Total 到底是“重算一次”还是“加总结果”.

只要你把这两件事讲清楚, 90% 的聚合坑都能躲开.