如何在分类内计算度量值的平均值?DAX公式场景示例
按分类计算度量值平均值的DAX解决方案
嘿,我来帮你捋清楚这个DAX计算的问题~首先,你当前用的公式Margem Média País = AVERAGEX(Clientes;[Margem Líquida *])逻辑是对的——它会先筛选出当前国家下的所有客户,计算每个客户的「Margem Líquida *」度量值,再对这些客户级别的结果取算术平均,所以在国家层级能正常运行。不过你提到后续有未完整描述的问题,我猜大概率是层级钻取时结果不符合预期,或者是计算逻辑和实际需求不匹配,下面分场景给你解决方案:
一、如果你的需求是「按国家计算有交易客户的边际值平均值」
当前公式会把所有关联到该国家的客户都算进去,哪怕有些客户没有任何交易记录(这时候他们的「Margem Líquida *」可能是空白或0)。如果要排除这些无交易的客户,修改公式如下:
Margem Média País = AVERAGEX( -- 只保留有交易记录的客户 FILTER(Clientes, CALCULATE(COUNT(Vendas[ID Venda])) > 0), [Margem Líquida *] )
二、如果你的需求是「按国家计算所有交易的边际值平均值」
如果实际想要的是国家下每一笔交易的边际值的平均(而不是客户级别的平均),那应该遍历事实表Vendas而不是Clientes:
Margem Média País (交易级) = AVERAGEX( Vendas, [Margem Líquida *] )
*注:如果「Margem Líquida 」是直接基于交易行计算的列(不是度量值),也可以简化为AVERAGE(Vendas[Margem Líquida]),但用AVERAGEX适配度量值的场景更通用。
三、解决层级钻取的结果异常问题
如果钻取到客户层级时,这个度量值显示的是该客户的边际值(这其实是正常的,因为AVERAGEX遍历单个客户时平均就是自身),但你希望非国家层级返回空白或其他逻辑,可以用ISINSCOPE来控制:
Margem Média País = IF( -- 仅在国家层级计算客户平均 ISINSCOPE(Geo[País]), AVERAGEX( FILTER(Clientes, RELATED(Geo[País]) = SELECTEDVALUE(Geo[País])), [Margem Líquida *] ), IF( -- 客户层级直接显示自身边际值 ISINSCOPE(Clientes[Cliente]), [Margem Líquida *], -- 其他层级返回空白 BLANK() ) )
额外检查点
别忘了确认你的数据模型关系是否正确:
Geo表和Clientes表之间要有基于País字段的关联(通常是1对多)Clientes表和Vendas事实表之间要有基于Cliente字段的关联(1对多)
只有关系正确,筛选上下文才能正确传递,保证计算结果准确。
内容的提问来源于stack exchange,提问作者user882670
相关产品推荐
相关产品推荐

