BOSS:白茶,有个逻辑,能实现不?
白茶:不能!(认真脸)
BOSS:......规矩我懂,加钱!
白茶:BOSS你说一下业务逻辑。(倾听中)
BOSS:是这样的,我们的组织架构,分为两层,管理层和销售层,实际业务销售过程中管理层也是有销售存在的,能不能把管理层自身的销售数据和下属的销售层数据汇总一起展示?
白茶:父级汇总自身数据及子级相关数据?
BOSS:对对对!就是这样,能搞不?
白茶:没问题!
本期的问题就是上面谈话的内容,那么这个需求在PowerBI中是如何实现的呢?
先来看看本期的案例数据:
案例数据共计两张表,一张销售事实表,一张人员架构的维度信息表。数据并不是特别的复杂,比较烧脑的是组织架构父级汇总子级数据。
例如:
在展示管理层人员“O”的销售金额时,需要计算O自身的销售额,以及PQRST这五个人的销售额,其余人以此类推。
将数据导入到PowerBI中,模型关系如下:
这里我们可以选择建立模型关系,也可以选择不建立,展示结果上,差异并不大。
这个需求的实现,涉及到了PATH函数和PATHCONTAINS函数。
PATH函数
语法:
代码语言:txt复制DAX=
PATH(<子级标识列>, <父级标识列>)
返回结果:
PATH结果可以返回整数和文本列,值得注意的是,子级和父级必须是物理列,不可以是表达式。
且PATH函数仅支持导入模式,不支持直连模式。
PATHCONTAINS函数
语法:
代码语言:txt复制DAX=
PATHCONTAINS(<PATH列>, <查找项>)
返回结果:
根据查找项来判断PATH函数生成的列是否包含查找项,返回逻辑值TURE或FALSE。
此函数也是仅支持导入模式,不支持直连模式。
新增计算列
在DIM表中,我们通过PATH函数,来新增一列,展示相关人员的完整架构层级路径。
代码语言:txt复制组织结构 =
PATH ( Dim[人员], Dim[直属领导] )
结果如下:
计算子级汇总
编写如下DAX,计算各个父级及相关子级数据汇总。
代码语言:txt复制总销售额 =
VAR ACCESS =
CALCULATETABLE (
VALUES ( Dim[人员] ),
FILTER ( ALL ( 'DIM' ), PATHCONTAINS ( 'Dim'[组织结构], VALUES ( 'DIM'[人员] ) ) )
)
RETURN
IF (
HASONEVALUE ( 'Dim'[人员] ),
CALCULATE (
SUM ( 'Fact'[销售金额] ),
FILTER ( ALL ( 'Fact' ), 'Fact'[销售人员] IN ACCESS )
)
)
结果如下:
解释一下代码含义:
变量ACCESS中,利用FILTER函数和PATHCONTAINS函数,根据每一行的数据,来筛选出完整的父子结构。例如:当直接筛选为O时,则会筛选出组织结构列中所有包含“O”项的行。
再通过CALCULATETABLE函数来筛选这些包含“O”项的人员行。
最后,通过CALCULATE函数与FILTER函数来判断每一行对应的人员项,利用ALL函数进行上下文清除汇总。
这里是白茶,一个PowerBI的初学者。