一、父子层级
在数据分析中,经常会遇到父子层级问题,通常来说,父子层级又可以分为两种情况,一种为图1,江苏中烟的销量就是南京品牌和苏烟品牌的销量之和,南京品牌的销量就是南京(硬红)和南京(炫赫门)的销量之和,即父级的值为子级值的和,父级不单独产生值;另一种为图2,是组织的层级结构,现在如果要统计相关的报销费用,会发现老板层级产生的报销费用不仅仅只是其子级经理层的报销费用之和,还包括了老板自己产生的报销费用;同理,经理层的报销费用不仅仅是其子级组长层的报销费用之和,还包括了经理自己产生的报销费用,此时父级会单独产生值。为此,将父子层级分为两类:一类是父级不单独产生值,另一类为父级单独产生值。本文主要介绍第二种类型父级单独产生值的情况。
图1:
图2:
二、问题描述
已知某组织层级结构和二月份费用报销清单如下
图:层级结构
表:二月份费用报销清单
要求,通过父子层级结构统计二月份的报销费用汇总表。结果呈现如下图
表:二月份的报销费用汇总表
三、问题分析
1、创建层级路径
- 新建列,层级路径=层级路径 = PATH('二月份费用报销清单'[姓名],'二月份费用报销清单'[直属上级])
2、创建层级
- 新建列,层级1 = PATHITEM('二月份费用报销清单'[层级路径],1)
- 新建列,层级2 = PATHITEM('二月份费用报销清单'[层级路径],2)
- 新建列,层级3 = PATHITEM('二月份费用报销清单'[层级路径],3)
- 新建列,层级4 = PATHITEM('二月份费用报销清单'[层级路径],4)
3、修正层级
分析:对于有报销费用且存在子级的人员姓名,在其子级显示其姓名,但在其次子级不显示(如果存在次子级)。换句话说,如果层级值为空且父级有非空子级,则显示为父值,否则显示原层级值。
- 新建列,层级一 = '二月份费用报销清单'[层级1]
- 新建列,层级二 = IF(ISBLANK('二月份费用报销清单'[层级2]) &&CALCULATE(DISTINCTCOUNTNOBLANK('二月份费用报销清单'[层级2]),FILTER(ALL('二月份费用报销清单'),'二月份费用报销清单'[层级1]=EARLIER('二月份费用报销清单'[层级1])))>0,'二月份费用报销清单'[层级1],'二月份费用报销清单'[层级2])
其中CALCULATE(DISTINCTCOUNTNOBLANK('二月份费用报销清单'[层级2]),FILTER(ALL('二月份费用报销清单'),'二月份费用报销清单'[层级1]=EARLIER('二月份费用报销清单'[层级1])))>0,用来判断其父级是否存在非空子级。
- 新建列,层级三 = IF(ISBLANK('二月份费用报销清单'[层级3]) && CALCULATE(DISTINCTCOUNTNOBLANK('二月份费用报销清单'[层级3]),FILTER(ALL('二
- 月份费用报销清单'),'二月份费用报销清单'[层级2]=EARLIER('二月份费用报销清单'[层级2])))>0,'二月份费用报销清单'[层级2],'二月份费用报销清单'[层级3])
- 新建列,层级四 = IF(ISBLANK('二月份费用报销清单'[层级4]) && CALCULATE(DISTINCTCOUNTNOBLANK('二月份费用报销清单'[层级4]),FILTER(ALL('二月份费用报销清单'),'二月份费用报销清单'[层级3]=EARLIER('二月份费用报销清单'[层级3])))>0,'二月份费用报销清单'[层级3],'二月份费用报销清单'[层级4])
4、创建父子层次结构
以字段“层级一”创建层次结构,然后依次将“层级二”、“层级三”、“层级四”添加到“层级一 层次结构”中。
5、新建度量值-报销费用
新建度量值,报销费用1 = SUM('二月份费用报销清单'[费用])
6、汇总表优化
问题,上图中姓名为空的报销费用不用显示,如何进行优化呢?
分析:逐个层级进行筛选判断,如果其筛选值为空且被当前层级筛选,则报销费用显示为空。例如,上图中第一个空值,其属于“层级四”,即如果筛选值为空,且被第四层级筛选,则报销费用显示为空。
- 新建度量值,层级一筛选 = ISFILTERED('二月份费用报销清单'[层级一])
- 新建度量值,层级二筛选 = ISFILTERED('二月份费用报销清单'[层级二])
- 新建度量值,层级三筛选 = ISFILTERED('二月份费用报销清单'[层级三])
- 新建度量值,层级四筛选 = ISFILTERED('二月份费用报销清单'[层级四])
红色框选的需要保留,黄色框选的不需要,两者的区别在于
(1)红色框内姓名不为空,黄色框内姓名为空;
(2)红色框内姓名属于第三层级,所以“层级四筛选“为”FALSE“,黄色框内姓名属于第四层
级,据以“层级四筛选“为”TRUE“。
备注:能否通过直接判断第一列姓名是否为空来去除?不可以。原因:如上图,虽然红色框内显示了“姓名“,但是其属于第三层级,其第四层级也是空,所以当第四层级的值为空时就去除,这时,红色框内的记录也会被去除。
对层级筛选进行优化
- 修改度量值,层级一筛选 = IF(ISBLANK(SELECTEDVALUE('二月份费用报销清单'[层级一])) && ISFILTERED('二月份费用报销清单'[层级一]),0,1)
- 修改度量值,层级二筛选 = IF(ISBLANK(SELECTEDVALUE('二月份费用报销清单'[层级二])) && ISFILTERED('二月份费用报销清单'[层级二]),0,1)
- 修改度量值,层级三筛选 = IF(ISBLANK(SELECTEDVALUE('二月份费用报销清单'[层级三])) && ISFILTERED('二月份费用报销清单'[层级三]),0,1)
- 修改度量值,层级四筛选 = IF(ISBLANK(SELECTEDVALUE('二月份费用报销清单'[层级四])) && ISFILTERED('二月份费用报销清单'[层级四]),0,1)
分析:需要去除的行的层级筛选中至少有一个0,而需要保留的行中层组织筛选中全是1。
对度量值报销费用进行优化
新建度量值,报销费用 = IF('度量值表'[层级一筛选] && '度量值表'[层级二筛选] && '度量值表'[层级三筛选] && '度量值表'[层级四筛选],SUM('二月份费用报销清单'[费用]),BLANK())
7、可视化图表优化
去除矩阵中的“报销费用1“、”层级一筛选“、”层级二筛选“、”层级三筛选“、”层级四筛选“。