Power BI之DAX神功:第3卷第1回 计算层级占比
一、ISINSCOPE与ISFILTERED函数的区别
《DAX神功》第2卷第20回 ISFILTERED函数
语法:ISFILTERED(表或列)
满足条件:指定表或指定表指定列被筛选时 返回:True
《PowerBI火力全开》笔记13.2 ISINSCOPE函数
语法:ISINSCOPE(列)
满足条件:同时满足该列处于层级结构且被筛选时 返回:True

我们使用《孙兴华讲PowerBI火力全开》课件打包中的 13.xlsx 演示


【度量值】ISINSCOPE = ISINSCOPE('商品表'[商品名称])
【度量值】ISFILTERED = ISFILTERED('商品表'[商品名称])

商品名称满足:被筛选 and 处于层级之内 , 所以返回True

现在我们分别
现在我们分别使用ISINSCOPE函数对【产品类别】和【商品名称】进行测试:
【度量值】ISINSCOPE商品名称 = ISINSCOPE('商品表'[商品名称])
【度量值】ISINSCOPE商品类别 = ISINSCOPE('商品表'[产品类别])

分开写看着不舒服,我们使用任天堂专用函数Switch把它们写在一起:
放在一起后的效果 = SWITCH(TRUE(),
ISINSCOPE('商品表'[商品名称]),"True",
ISINSCOPE('商品表'[产品类别]),"True",
"False")

先做到这里,我们回忆一下"占比专用函数"
二、"占比专用函数" ALLSELECTED
《DAX神功》第1卷第11回 ALLSELECTED函数
ALLSELECTED函数:内部筛选全部取消(删除),但外部筛选可以。
【度量值】总销售 = sum('销售表'[销售])
【度量值】分母 = CALCULATE([总销售],ALLSELECTED('商品表'[商品名称]))

【度量值】占比 = DIVIDE([总销售],[分母])

当我筛选商品名称时:原理详见《DAX神功》第1卷第11回

三、计算层级占比
【度量值】占比层级 =
SWITCH(TRUE(),
ISINSCOPE ('商品表'[商品名称]), DIVIDE([总销售],CALCULATE([总销售],ALLSELECTED('商品表'[商品名称]))),
ISINSCOPE ('商品表'[产品类别]), DIVIDE([总销售],CALCULATE([总销售],ALLSELECTED('商品表'[产品类别]))),
DIVIDE([总销售],CALCULATE([总销售],ALLSELECTED('商品表'[商品名称]))))

友情提示:switch函数要从内层向外层写,因为当商品名称被筛选时,产品类别也会被筛选,所以我们要先判断最内层,逐渐向外层判断。打个最简单的比方:《古惑仔》中一个社团有不同的层级,你想调查最顶级的大哥那是天方夜谭,坏事不一定他亲自做,都是大哥安排二哥,二哥安排三哥。。。最后小弟执行。调查也要先查小弟,让他供出大哥。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等