最近做的Tableau報告裏遇到一個非常有意思的複雜組合計算。
問題描述
首先,來說一下業務邏輯。售後服務部門有兩種服務業務,第一是免費的保修服務,第二是收費的保外服務。
保修服務是指在保修期內,非客戶原因造成的損壞,則可以提供免費維修。
保外服務是指在保修期內因客戶原因造成的損壞,和保修期外一切的損壞,提供有償維修服務。
因此,
-
保內返修率計算公式: 保內維修量 / 保修期內產品量
所有保修維修全部來自於保修期內產品,因此分母爲保修期內產品量。 -
保外返修率計算公式:保外維修量 / (保修期內產品量+保修期外的產品量)
保外維修可能來自於保修期外產品量,也可能來自於保修期內(如產品損壞是客戶自己造成的),因此分母是保修期內產品量加上保修期外的產品量。 -
總返修率 :(保內維修量+保外維修量) / (保修期內產品量+保修期外的產品量)
總返修率是總返修量除以保修期內加保修期外總產品量。
數據格式爲:
產品 | 保修狀態 | 維修量 | 產品保有量 |
---|---|---|---|
產品 A | 保內 | 80 | 4500 |
產品 A | 保外 | 180 | 8600 |
產品 B | 保內 | 36 | 500 |
產品 B | 保外 | 78 | 3400 |
產品 C | 保內 | 160 | 4500 |
產品 C | 保外 | 210 | 6700 |
產品A的保內返修率 = 保內維修量 / 保修期內產品量 = 80 / 4500 = 1.78%
產品A的保外返修率 = 保外維修量 / (保修期內產品量+保修期外的產品量) = 180 / (4500 + 8600) = 1.37%
產品A的總返修率 = (保內維修量+保外維修量) / (保修期內產品量+保修期外的產品量)= (80+180) / (4500 + 8600) = 1.98%
實現方法
使用Tableau時你會發現,這個問題不能簡單的用聚合公式來計算。我的解決方案如下:
定義一個變量 Failure Rate Type, 數據類型是String,值有三種: INW, OOW, TOTAL. 分別對於現實值 “保修內返修率”,“保修外返修率”, ‘“總返修率’。
定義新字段**[計算 - 維修量]**的計算公式如下:
IF [Failure Rate Type] = 'INW' AND [保修狀態] = '保內' THEN [維修量]
ELSEIF [Type] = 'OOW' AND [保修狀態] = '保外' THEN [維修量]
ELSEIF [Type] = 'TOTAL' THEN [維修量]
ELSE 0
END
定義新字段**[計算 - 產品保有量]**的計算公式如下:
IF [Failure Rate Type] = 'INW' AND [保修狀態] = '保內' THEN [產品保有量]
ELSEIF [Type] = 'OOW' AND ([保修狀態] = '保內' OR [保修狀態] = '保外') THEN [產品保有量]
ELSEIF [Type] = 'TOTAL' THEN [產品保有量]
ELSE 0
END
這兩個字段會根據[Failure Rate Type]的不同選擇不同的維修量值和產品保有量值。現在,我們只要定義**[返修率] = sum([維修量])/sum( [計算產品保有量] )**,並且設置“Show Parameter Control” 就可以使用[Failure Rate Type] 控制來得到我們想要的結果了, 即使是使用聚合運算也沒有問題。
- 當[Failure Rate Type] = ‘INW’時, 這兩個字段以及**[返修率]**呈現出來的結果,以及按產品各級聚合結果如下。
產品 | 保修狀態 | 維修量 | 產品保有量 | 計算 - 維修量 | 計算-產品保有量 | 返修率 |
---|---|---|---|---|---|---|
產品 A | 保內 | 80 | 4500 | 80 | 4500 | =80/4500 |
產品 A | 保外 | 180 | 8600 | 0 | 0 | - |
產品 A 總共 | * | 360 | 13100 | 80 | 4500 | = 80/4500 |
產品 B | 保內 | 36 | 500 | 36 | 500 | = 36/500 |
產品 B | 保外 | 78 | 3400 | 0 | 0 | - |
產品 B 總共 | * | 114 | 3900 | 36 | 500 | = 36/500 |
產品 C | 保內 | 160 | 4500 | 160 | 4500 | = 160/4500 |
產品 C | 保外 | 210 | 6700 | 0 | 0 | - |
產品 C 總共 | * | 370 | 11200 | 160 | 4500 | = 160/4500 |
總共 | * | 844 | 28200 | 276 | 9500 | = 276/9500 |
- 而當[Failure Rate Type] = ‘OOW’時, 這兩個字段以及**[返修率]**呈現出來的結果如下。
產品 | 保修狀態 | 維修量 | 產品保有量 | 計算 - 維修量 | 計算-產品保有量 | 返修率 |
---|---|---|---|---|---|---|
產品 A | 保內 | 80 | 4500 | 0 | 4500 | - |
產品 A | 保外 | 180 | 8600 | 180 | 8600 | =180/8600 |
產品 A 總共 | * | 360 | 13100 | 180 | 13100 | =180/13100 |
產品 B | 保內 | 36 | 500 | 0 | 500 | - |
產品 B | 保外 | 78 | 3400 | 78 | 3400 | =78/3400 |
產品 B 總共 | * | 114 | 3900 | 78 | 3900 | =78/3900 |
產品 C | 保內 | 160 | 4500 | 0 | 4500 | - |
產品 C | 保外 | 210 | 6700 | 210 | 6700 | =210/6700 |
產品 C 總共 | * | 370 | 11200 | 210 | 11200 | =210/11200 |
總共 | * | 844 | 28200 | 468 | 28200 | = 468/28200 |
- 當[Failure Rate Type] = ‘OOW’時, 這兩個字段以及**[返修率]**呈現出來的結果如下。
產品 | 保修狀態 | 維修量 | 產品保有量 | 計算 - 維修量 | 計算-產品保有量 | 返修率 |
---|---|---|---|---|---|---|
產品 A | 保內 | 80 | 4500 | 80 | 4500 | =80/4500 |
產品 A | 保外 | 180 | 8600 | 180 | 8600 | =180/8600 |
產品 A 總共 | * | 360 | 13100 | 360 | 13100 | =360 /13100 |
產品 B | 保內 | 36 | 500 | 36 | 500 | = 36/500 |
產品 B | 保外 | 78 | 3400 | 78 | 3400 | =78/3400 |
產品 B 總共 | * | 114 | 3900 | 114 | 3900 | =114/3900 |
產品 C | 保內 | 160 | 4500 | 160 | 4500 | = 160/4500 |
產品 C | 保外 | 210 | 6700 | 210 | 6700 | =210/6700 |
產品 C 總共 | * | 370 | 11200 | 370 | 11200 | =370 /11200 |
總共 | * | 844 | 28200 | 844 | 28200 | = 844 /28200 |