Power BI:基于列内特定值计算列占比,现有DAX公式仅首行有效
排查DAX公式问题并实现品类销量相对占比
问题分析
首先看你遇到的问题:公式只有Helmets行计算正确,其他品类结果异常,核心原因有两个:
变量拼写错误:你定义的变量是
_myPercent,但在Return部分引用的是myPercent(少了下划线)!这会导致DAX无法识别该变量,只有Helmets行因为分子分母刚好都是自身销量(相当于SUM(Sales)/SUM(Sales))才看起来正确,其他品类的分母会因变量未找到出现异常计算。筛选逻辑冗余且不够精准:你嵌套了多个
FILTER函数,其实可以通过更简洁的CALCULATE筛选器实现,同时要注意保留日期上下文,避免不必要的筛选冲突。
正确的DAX实现方案
下面是优化后的公式,既解决了拼写问题,又简化了筛选逻辑,还能避免除以0的错误:
CY% = VAR _helmetSales = CALCULATE( SUM(Production[Sales]), Production[Category] = "Helmets", ALL(Production[Category]) // 仅清除品类的筛选上下文,保留日期等其他筛选 ) VAR _currentCategorySales = CALCULATE( SUM(Production[Sales]), KEEPFILTERS(Production[Week] <= MAX(DatesTable[CurrentWeek])), KEEPFILTERS(Production[Year] = MAX(DatesTable[CurrentYear])) ) RETURN DIVIDE(_currentCategorySales, _helmetSales, 0)
关键细节解释
_helmetSales变量:用ALL(Production[Category])清除当前行的品类筛选,确保无论当前显示的是哪个品类,都能获取到Helmets在相同日期范围内的销量,比ALL(Production)更精准(不会清除其他表的筛选)。_currentCategorySales变量:KEEPFILTERS用来保留当前的日期筛选条件,确保计算的是当前品类在指定年份和截至当前周的销量。DIVIDE函数:替代直接除法,当Helmets销量为0时会返回你设置的默认值(这里是0),避免报表出现错误提示。
更简洁的版本(依赖报表日期筛选)
如果你的报表已经通过日期表筛选了年份和当前周,公式可以进一步简化:
CY% = VAR _helmetSales = CALCULATE( SUM(Production[Sales]), Production[Category] = "Helmets", ALL(Production[Category]) ) RETURN DIVIDE(SUM(Production[Sales]), _helmetSales, 0)
这个版本利用DAX的筛选上下文自动继承报表的日期筛选,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

