Power BI含子行矩阵中DAX市场份额占比的正确计算方法
Power BI矩阵中客户及产品层级的市场份额度量值修正
场景与问题
- 矩阵行结构:父行是客户名称(
sales[cardname]),子行是对应客户的产品(sales[itemname]) - 已定义度量值:
Unique Products = CALCULATE( DISTINCTCOUNT(sales[itemname]) ) - 需求:基于客户/产品的唯一产品数 ÷ 指定周期内全局唯一产品数计算市场份额,要求客户层级和产品层级均显示正确占比
- 当前异常:客户层级占比正确,但展开产品子行后,每个产品的占比显示为100%(预期应为单个产品在周期总产品数中的占比,如总60个产品时约1.6%)
当前尝试的度量值
初始版本
% Market Share = VAR TotalProducts = CALCULATE( DISTINCTCOUNT(sales[itemname]), ALL(sales[cardname], sales[docdate]) // docdate = 销售日期 ) VAR ProductsByClient = CALCULATE( DISTINCTCOUNT(sales[itemname]) ) RETURN DIVIDE(ProductsByClient, TotalProducts, 0)
优化尝试版本
New Market Share % = VAR NumProductsContext = [unique products] VAR DateMin = MINX( ALLSELECTED( sales[docdate] ), sales[docdate] ) VAR DateMax = MAXX( ALLSELECTED( sales[docdate] ), sales[docdate] ) VAR TotalProductsPeriod = CALCULATE( DISTINCTCOUNT( sales[itemname] ), REMOVEFILTERS( sales[cardname], sales[itemname] ), FILTER( ALL( sales ), sales[docdate] >= DateMin && sales[docdate] <= DateMax ) ) RETURN DIVIDE( NumProductsContext, TotalProductsPeriod, 0)
修正后的度量值方案
核心思路:确保分母的周期总唯一产品数不受客户、产品行上下文的筛选影响,同时保留页面/切片器的日期筛选。
% Market Share = DIVIDE( [Unique Products], CALCULATE( [Unique Products], // 移除客户和产品的行筛选,保留日期等全局筛选 REMOVEFILTERS(sales[cardname], sales[itemname]) ), 0 )
原理说明
- 分子
[Unique Products]:在客户层级返回该客户的唯一产品数,在产品层级返回1(单个产品的唯一计数) - 分母:通过
REMOVEFILTERS移除客户和产品的筛选上下文,计算整个筛选周期内的全局唯一产品数,确保在任何行层级下分母值都保持一致 DIVIDE函数自动处理除零情况,返回0作为默认值
内容的提问来源于stack exchange,提问作者Ed_7830
相关产品推荐
相关产品推荐

