在上一课里, 我们介绍了逻辑运算的前两层, 最内层你可以理解为是True和False的计算, 第二层是第一层的计算结果通过AND, OR 和括号等运算符的叠加来得到一个更复杂的运算. 在这一课里, 我们将来到逻辑运算的最外层,直接创建一个完整的逻辑表达式。而在第三层当中, 最重要的知识点就是IF Statement. 也就是在所有变成语言当中最常见的IF THEN.
IF Statement
If statement的完整格式就是 IF [条件1] THEN [结果1] ELSEIF [条件2] THEN [结果2] ELSEIF [条件N] THEN [结果N] ELSE [其他结果] END.
在这个格式当中, 条件1,2,3就对应的是我们上一课学习到的逻辑计算. 条件必须是一个结果为True或者是False的计算才可以。
下面我举一个最简单的例子。假设我想把Sample Superstore当中的区域中Central和East合并为区域A, 把South和West合并为区域B
IF [Region] = ‘Central‘ or [Region] = ‘East‘ then ‘A‘
ELSE ‘B‘
END
初学者的常见错误
混淆等号的含义
由于很多人会在脑海里这么翻译, 如果区域等于Central或者是等于East 那么区域等于A。 那么相对应的,你可能会把IF的第一部分写成这样:
IF [Region] = ‘Central‘ or [Region] = ‘East‘ then [Region] = ‘A‘
假设我们新区域的名字叫New Region, 那么可能你就会想这么写
IF [Region] = ‘Central‘ or [Region] = ‘East‘ then [New Region] = ‘A‘
这种写法翻译起来非常舒服, 但是这里犯了一个错误, 这在上一课的时候我没有提及. 在一些编程语言当中, 等号有的时候所代表的涵义并不是用来判断, 而是用来赋值, 而双等号==则用来判断. 也就是说此时此刻,你把等号的意义混搅了. 你无意当中把等号赋予了'让xxx等于xxx‘的含义, 但是你并没有意识到Tableau当中等号是没有这个作用的, 它只能判断xxx是否等于xxx
现在如果我们回过头来看 IF [Region] = ‘Central‘ or [Region] = ‘East‘ then [New Region] = ‘A‘ 这种写法, 它的含义是,如果region是Central或者East, 那么返回New Region是不是等于A的判断结果.
结合创建计算的界面来理解IF Statement
为了克服这种思维惯性, 我们就需要更深入的理解创建计算背后的逻辑
上边的这个截图就是我们在Tableau当中,实际创建New Region这个计算的界面.
与编程语言不通的是, 我们在整个创建计算界面的最上方有一个输入框, New Region就代表了我当前所创建的这个计算的名字叫New Region. 也正是因为如此, 我在计算的定义里就不需要再次出现New Region了, 这是第一点
接下来我们结合整个截图来看. 它的含义就类似于
[New Region] = (IF [Region] = 'Central' or [Region] = 'East' then 'A' ELSE 'B' END)
你可以通过这种方法来记住这一点: [New Region]等于A, 或者[New Region]等于B的这个部分在你创建这个计算的时候, 它就已经出现在最最上边了. 因此在IF当中,我们不需要再次强调我们想让[New Region]等于A的意思.
忘记加END
如果你没有注意到我上一个部分写的每个表达式结尾都没加END, 就说明你的潜意识里没有意识到在每个IF Statement的结尾是必须要加END的.
这个错误并不是什么大错而且也很容易识别. 只不过对于初学者来说, 要尽量养成加END的好习惯. 有两种方法可以规避这个问题.
当你准备开始写一个IF Statement时, 你先把, IF ELSE END这些关键词写上, 然后再填充中间的的内容, 这样就不存在遗漏END的可能
如果每次IF写到最后, 敲一次回车,在IF的正下方添加上END, 那么以后无论IF后边有多长,你就会总觉得IF下边少了点什么,能够在潜意识里把END加上.
IF [Region] = 'Central' or [Region] = 'East' then 'A' ELSE 'B'
END
每个THEN后边的数据格式要一致
我们再回到New Region这个案例. 根据我们的IF Statement, New Region最终的值可能是A, 也可能是B. 那么有没有可能让New Region最终的值可能是A, 也有可能是一个数字呢.
IF [Region] = 'Central' or [Region] = 'East' then 28 ELSE 'B' END
在上边这个表达式里, 我把ELSE后边改成了数字28, 到了这个时候, Tableau就会报错. 由于我们创建的是一个新的计算, 而这个计算只能有一种格式. 它要么全是数字,要么全是字符,要么全是True False, 它不能保存不同格式的数据, 这是不允许的.
识别这个错误的方法也并不难, 如果你点击最下边的The calculation contains errors的部分, 它会告诉你, 它期待的格式是String, 但是发现了整数. IF表达式的结果格式必须要一致. 你看完这个报错信息同样能意识到,你在THEN后边所使用的数据格式是不同的
如果你决定不写ELSE, 那么默认就是ELSE Null
Tableau是允许用户在IF Statement当中不写ELSE的, 但是不写ELSE就意味着默认的ELSE就会变成Null.你可能感觉没什么, 但是现实当中, Null有的时候会现实成一片空白. 这就意味着, 如果你的Tableau Dashboard要展示给别人看, 肯定会有人问你那个空白是代表什么意思, 因此我推荐你如果使用IF或者后边介绍的Case Statement给数据分组时,
文字默认用'Other' 来放在ELSE的后面
数字默认用0来放在Other的后面
这其中的深意你在初学阶段还不理解, 照着做就是了.
Case Statement
如果说前边写了这么多是专门讲解如何写IF Statement的话, 那么下边这段就是如何写Case Statement的.
CASE Statment是一种简化的IF Statement. 如果我们把IN 理解为多个OR的简化版本. 那么CASE STATEMENT就是多个IF的简化版本
CASE STATEMENT最常见的就是对于一个column, 1对1的映射. 我接下来举一个最简单的例子. 假设我们数据当中有一列叫做[Month], 此时我们想要创建一个新的列叫做[Month Name]
如果Month = 1, 那么Month Name就是Jan, January的缩写, 以此类推, 2 对应Feb, 3对应Mar. 这就是值的一对一映射.
如果我们用IF写, 那就是 IF [Month]=1 then 'Jan' ELSEIF [Month]=2 then 'Feb' else ‘Other‘ END
如果我们换成Case 那就要简洁很多
CASE [Month]
WHEN 1 THEN ‘Jan‘
WHEN 2 THEN ‘Feb‘
…
WHEN 12 THEN ‘Dec‘
END
Case在这种使用情况下不仅比IF简洁的多, 而且逻辑的可读性也更好.
初学者的常见错误
CASE后边忘记加映射的起点
不同于IF是在condition当中加入[Month], CASE是在最开始就告诉Tableau, 我要映射的是[Month]这一列. IF是IF [Month] = 1 then 但是Case是 Case [Month] 然后是When
这是两者非常不同的一点. 如果你是像写IF 一样, CASE WHEN [Month] = 1 THEN, 那么就大错特错了.
WHEN 后边不是逻辑判断,而是一个具体的值
WHEN 1 THEN ‘Jan‘ 在when和then后边没有逻辑, 只有一个值和对应的另一个值. 两者一一对应
给初学者的建议
作为初学者我建议你第一阶段先放弃使用Case, 专注于IF Statement的创建. Case Statement更适用于对Tableau有一定熟练度之后, 提速阶段所使用的技巧.我在这里加入CASE更多是给你埋在一个种子, 未来你需要的时候, 可以到这一刻回看Case Statement的要点.