2.24 PowerBI数据建模-占比
比如年和产品下的销量占比,整体指的是所有年和产品的整体,年和产品以外的其他维度对占比有筛选作用。),返回的就是当前上下文中部分的值,如果把产品字段放到矩阵的行或列上,度量值返回的就是对应的产品的销量;1 单一维度整体占比:某个维度部分的值在该维度整体的值中的占比,只需要通过ALL清除当前上下文中的这个维度对分母的筛选即可。比如产品销量在所选产品中的占比。6 多个任意维度所选总体占比:当前上下文中,
加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
占比在大多数分析中都会用到,用部分的值除以整体的值得出部分在整体中的比例,体现部分在整体中的重要性。
解决方案
在PowerBI中,占比的分子直接使用普通的度量值(比如销量= SUM('Fact_Sales'[SalesVolume])),返回的就是当前上下文中部分的值,如果把产品字段放到矩阵的行或列上,度量值返回的就是对应的产品的销量;占比的分母通过CALCULATE+ALL或ALLSELECTED清除当前上下文中占比字段对度量值的筛选,返回整体的值。
按占比字段的个数和分母是整体还是所选整体,可以分为:
1单一维度的整体占比
2单一维度的所选整体占比
3多个指定维度整体占比
4多个指定维度所选整体占比
5多个任意维度整体占比
6 多个任意维度所选整体占比
举例
模型
销售表
包含2年、2个品类、4个产品的销售数据。
度量值
销量:
Sales = SUM('Fact_Sales'[SalesVolume])
占比:
1 单一维度整体占比:某个维度部分的值在该维度整体的值中的占比,只需要通过ALL清除当前上下文中的这个维度对分母的筛选即可。比如产品销量占比,整体指的是所有产品,产品以外的其他维度对占比有筛选作用。
Sales_Con%_ALL_Product = DIVIDE([Sales], CALCULATE([Sales], ALL(Dim_Product[Product])))
如果选择了2021年,占比会随产品以外的筛选发生变化,分子和分母变成了2021年的销量。
但是如果选择了产品中的橘子,只是把橘子的销量占比筛选出来显示了,分母不会发生变化。这是因为使用ALL()的分母不受相应字段筛选,返回的是所有的整体的值,占比是部分在整体中的占比。
2 单一维度整体占比:在单一维度整体占比基础上,增加了占比维度本身的筛选,把上面代码中的ALL换成ALLSELECTED即可。比如产品销量在所选产品中的占比。
Sales_Con%_ALLSELECTED_Product =
DIVIDE([Sales], CALCULATE([Sales], ALLSELECTED(Dim_Product[Product])))
如果选择了产品中的橘子和苹果,橘子和苹果的占比是在所有筛选(包括产品筛选)下的占比,占比之和为100%。这是因为使用ALLSELECTED()的分母会随上下文返回相应字段所选的整体的值,占比是部分在所选整体中的占比。
3 多个指定维度整体占比:2个或2个以上指定维度交叉后的部分的值在这些维度的整体的值中的占比。只需要通过ALL清除当前上下文中的这些维度对分母的筛选即可。比如年和产品下的销量占比,整体指的是所有年和产品的整体,年和产品以外的其他维度对占比有筛选作用。
Sales_Con%_ALL_Year_Product =
DIVIDE([Sales], CALCULATE([Sales], ALL(Dim_Date[Year]), ALL(Dim_Product[Product])))
如果选择了水果,占比会随产品以外的筛选发生变化,分子和分母变成了水果的销量。
但是如果选择了2021年,只是把2021年的销量占比筛选出来显示了,分母不会发生变化。
4 多个指定维度所选整体占比:在多个指定维度的整体占比基础上,增加了占比维度本身的筛选,把上面代码中的ALL换成ALLSELECTED即可。比如年和产品销量在所选年和产品中的占比。
Sales_Con%_ALLSELECTED_Year_Product =
DIVIDE([Sales], CALCULATE([Sales], ALLSELECTED(Dim_Date[Year]), ALLSELECTED(Dim_Product[Product])))
如果筛选了2021年和橘子、白菜,占比就是以2021年的橘子、白菜销量作为整体,占比求和为100%。
5 多个任意维度总体占比:当前上下文中各种维度交叉下的部分的值在整体的值中的占比。
Sales_Con%_ALL = DIVIDE([Sales], CALCULATE([Sales], ALL()))
任意字段无论怎么筛选,分母都不会发生变化,因此占比也不变。
6 多个任意维度所选总体占比:当前上下文中,各种维度交叉下的部分的值在所选整体的值中的占比,只需要把上面代码中的ALL换成ALLSELECTED即可。
Sales_Con%_ALLSELECTED = DIVIDE([Sales], CALCULATE([Sales], ALLSELECTED()))
如果选择了2022年,占比是以2022年的销量作为整体,每种维度字段下的占比求和为100%。
拓展
1 多个指定维度整体占比中的多个ALL,如果来自同一个表且字段较多,可以反向使用ALLEXCEPT简化代码。
2 如果占比的分子需要固定为某个维度值,用于卡片图,比如橘子销量在整体(所有产品)中的占比,分子可以写成:
橘子整体占比 =
DIVIDE(CALCULATE([Sales], Dim_Product[Product]="橘子"), CALCULATE([Sales], ALL(Dim_Product[Product])))

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)