加入 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])))

Logo

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

更多推荐