#根据客户的真实业务改编而来。适用于具有多个节点的销售过程转化等类似场景。
生产场景案例-工序中的损耗监控
在生产中,有一个常见的场景-监控各个工序间的材料损耗情况,这也是生产审计中非常重要的一环。本文将结合实际场景,通过虚拟的案例介绍Tableau实现相关分析过程的方法。
一、业务说明
本案例以A工厂为原型,它的组织结构和生产过程如图1所示。工厂中包含多个车间,每个车间每月要处理多个工单,一个工单包含多个组件,而每个合格组件的生产都必须经历5道工序。

图1:A工厂生产过程
图2展示了A工厂的数据结构:每一道工序为一个单独的字段,数据以日期和时间类型呈现。对于每一个组件而言,序列号是唯一识别字段。如果一个组件进入到具体的生产工序,则会显示进入该工序的时间,否则显示为null。

图2:A工厂生产数据结构
我们的目标是:1)监控有多少组件在各生产工序间被损耗(人为损耗、统计损耗或其他损耗);2)对于损耗的组件,精确查找其序列号,以便管理人员追踪损耗原因。
二、分析过程
结合生产数据结构,直接完成上述目标有一定的难度。为了便于理解,我们不防将整体目标拆分为以下三个标准问题来逐步实现:
1) 各车间、各工单、各工序的组件数量
2) 各车间、各工单、各工序的损耗组件数量(即相邻工序的组件数量差异)
3) 损耗组件的序列号
三个问题层层递进,每一个问题的层次都与上一个问题的答案关联。例如:问题二中相邻工序间组件数量的差异依赖于问题一中的各工序组件数量的计算;问题三中损耗组件的判定方式来自于问题二中的损耗组件数量的计算逻辑。运用具有层次的分析思路,先简化问题,再逐步迭代,直至到达最终的分析目标,是我们解决复杂问题的基本方法。
2.1 各车间、各工单、各工序的组件数量
相对于后续问题,第一个问题“各车间、各工单、各工序的组件数量”最为简单,但也是其他高级问题的基础。各车间、各工单、各工序作为问题的维度字段,可以直接在数据源中获取;组件数量作为唯一的度量字段,需要我们通过计算获得。在原始数据中,进入各工序的组件是以日期和时间的形式呈现的:当组件进入某一工序时,记录进入的日期和时间,未进入该工序的组件则没有记录。想要得出各工序内组件的数量而非时间,我们可以用计数的方式对时间进行聚合。需要强调的是,这里我们应该使用count函数,而非countd函数。countd函数对不同的明细行才会计数;而count函数不会区分具体的明细内容,只要有记录就会计数。在本案例中,各组件存在同一时间进入某一工序的可能。这种情况下,它们应当被分别计数,而不应被合并视为同一枚组件。
由此,通过已有的维度字段和简单计算得出的度量字段,我们就得出了第一个问题答案的交叉表(图3)。

图3:使用count函数计算各车间、各工单、各工序的组件数量
2.2 各车间、各工单、各工序的损耗组件数量
在开始第二个问题前,我们可以先观察图3计算的结果。由上图我们不难发现,对于每一个工单而言,各工序之间的组件数量存在一定差异,这与我们的生产要求不符。在本案例的业务说明中,我们已经提到,每一个组件必须经历完整的5道工序。如果有组件未进入到下一工序,则表明该组件在工序间出现了损耗。换言之,当某一工序中的组件数量低于上一工序的组件数量时,这个差异就可以被视为工序间的损耗量。因此,对于每一道工序的损耗量,我们可以用相邻两道工序间组件数量的差额来计算,即 :count([当前工序])-count([上一工序])。理解了这个逻辑,我们就理解了第二个问题的关键。相应的,问题二也就可以转化为:各车间、各工单、各相邻工序的组件数量差异。
如图4所示,借助各车间、各工单号、各相邻工序间的组件数量差额交叉表,我们可以定位到每一个工单在各工序间的损耗量(以图中红框标出的数值为例,这里的”-3″表明,其对应的xx04车间,xxxxx001号工单在工序3-工序4的过程中有3件损耗)。这也是第二个问题的答案。

图4:利用相邻两道工序间组件数量差额计算各车间、各工单、各工序的组件损耗量
2.3 损耗组件的序列号
计算出了各车间、各工单、各工序的组件损耗量,接下来就是本案例的重点:精确列示损耗组件的序列号。
在第三个问题中,序列号是可以在源数据中直接获取的字段,但损耗组件需要通过逻辑判断获得。在回答前两个问题的过程中,我们已经梳理了损耗组件的判定逻辑。损耗的组件即为在上一个工序中显示时间,但在本工序中显示为空值的组件。在实际操作中,具体判断可以简化为:在上一个工序中不为空,而在下一个工序中记录为空的组件。转化为Tableau语句,即 not ISNULL([上一工序]) AND ISNULL([当前工序])。如果建立一个工序过程参数,我们就可以为每一道工序过程写出如下判断(图5):

图5:基于对每一个工序过程的判断,仅保留损耗组件的序列号
基于以上判断,我们就可以筛选出在每个工序过程中损耗的组件,第三个问题也随之解决。但我们最终的目标是:基于问题二中交叉表生成的损耗数量,精确列示问题三中损耗件的序列号。因此,接下来关键的一步是实现两个问题的联动。
2.4 实现联动筛选
通常,工作表间的互动并不算是难题。建立仪表板,激活工作表的筛选器功能,就是最为常见的一种联动筛选方式。然而,在本案例中,这种方式并不能完全解决问题。我们不防通过对于常规方法的尝试来体会其失败原因。
如图6所示,激活工作表的筛选器功能,当我们点击左侧工作表中的损耗量数值-3时,右侧工作表为我们展示的是-3所对应车间及工单下的所有组件的序列号,而非仅显示3个损耗件的序列号。这是因为,工作表的筛选器功能仅仅传递了所选损耗量对应的“工单号”,并未传递其对应的“工序过程”,从而也无法执行问题三中带有参数的条件判断。

图6:仅使用仪表板中的工作表筛选器功能,只能筛选损耗件对应工单的所有组件
再次观察问题二的交叉表,我们可以发现,选中的数值-3,是由“工单号”和“工序过程”两个字段共同决定的。因此,只筛选传递“工单号”,或者只筛选传递“工序过程”都无法得出精确的结果。所以,在工作表筛选器的基础上,我们还需要借助另一种方式来联动更改“para-工序过程”参数,实现完整的筛选。这种方式就是仪表板的参数动作功能。如图7,在仪表板的参数动作中,我们可以将问题二工作表中的“工序过程”(即损耗量数值所对应的“度量名称”字段)传递给“para-工序过程”参数,从而在点击损耗量时,实现“para-工序过程”参数的自动更新,继而影响问题三的条件判断。如此一来,精确定位损耗件的两个关键字段:“工单号”和“工序过程”,都实现了在工作表间的传递联动,问题三列示的“损耗件”也就可以精准对应问题二中指定的“损耗量”了。

图7:通过仪表板参数动作功能更新”para-工序过程”参数
至此, 如图8所示,借助仪表板筛选、参数动作、逻辑判断等功能,我们最终完成了对于损耗组件的数量监控和损耗件序列号的精确查询。

图8:借助仪表板筛选、参数动作、逻辑判断等功能完成损耗组件的数量监控和精确查询
@xilejun
May 11, 2022