“你的Tableau生涯里如果没犯过这个错误, 你的Tableau生涯就是不完整的"
在后续的学习过程中,你将不止一次遇到上边这个截图里的错误. 今天这节课就是系统的去解释这个错误❌发生的原因和解决方法
我们首先通过一个简单的例子来复现这个错误.
左边的这个计算是一个非常简单的计算, 我们从这个计算的内容大概可以判断出, 我们想要创建一个总的数量大于10, 但是总的销售额小于1000的这个一个Filter.
错误信息解读 Cannot mix aggregate and non-aggregate arguments with this function
我们先来一段一段翻译一下这句话: 无法混合, 聚合的和聚合的, arguments with this function.
我先来解释一下最后这一段 arguments with this function. 什么是argument, 什么是function?
现在回到Tableau里边. 我们创建的是一个计算, 而一个计算从数学角度上来说就是一个函数, 函数就是我们初中学的 f(x) = y. 而更复杂的函数往往都是, f(x1, x2, x3) = (y1, y2, y3)
Argument就是这个x. 那么在这个Tableau Calculated Field里边, 我们写的是 [Quantity] > 10 and SUM(Sales) < 1000. 这就是我们的输入, 而输出的是True or False. True就是数量大于10并且销售额小于1000.
那么用数学语言来写f([Quantity]>10, SUM(Sales)<1000) = (True, False) 这就是一个函数的左边和右边.
那么aggregate and non-aggregate arguments显然指的就是我们输入的这俩表达式了, 一个是[Quantity] > 10, 一个是SUM(Sales) < 1000
那么到了这, 我们就很容易看出来[Quantity] > 10 就是那个Non-Aggregate Argument 而SUM (Sales) < 1000就是那个 Aggegate Argument.
为什么Tableau无法处理这个计算呢? 计算的一致性
我们首先看[Quantity]>10这个表达式. 它是运行在数据里的没一行的. 也就说你有一百万行, 那么[Quantity]>10 就可以返回100万个True or False. 这个相比大家没有问题.
但是我们看看另一边, SUM([Sales])<1000. 在前一课当中我们知道, SUM([Sales])的结果是无法判定的. 当我们聚合在消费者这个层级, 它返回的消费者的总sales. 如果到了产品那一级,它返回的就是每个产品的总销售额. 所以这是一个动态的计算, 光这个表达式自己是不足以让我们知道计算结果的. 它缺少关键的另一半.
想象一下, 一百万个True or False只跟一个True or False是没法对接的
如何解决这个问题?
解决的思路无非就是两个, 一个是把non-aggregate的部分变成 aggregate的部分. 而另一个就是反过来.
第一种解决方案: SUM([Quantity])>10 and SUM([Sales])<1000
这种解决方法确保了, 如果一百万行聚合到一行, 那么两个部分都会只有一个结果. 这个聚合的过程在两个argument当中是同时发生的.
第二种解决方案: [Quantity]>10 and [Sales]<1000
这种解决方案同样不会报错, 但是它的含义就会发生变化. 它不再是看整体的销售数量和销售额. 而是在数据当中的每一行都进行这个运算, 然后再将每一行的结果进行聚合. 就和我们前边那一课讲的过程一模一样.