Power Pivot中带筛选响应的年度加权销售额计算问题
Power Pivot加权销售额计算:让年度总销售额响应渠道筛选
嘿,我来帮你搞定这个问题!先理清楚你的场景和遇到的问题:
你的数据与当前设置
你手头的销售数据如下:
| year | channel | discount | sales |
|---|---|---|---|
| 2015 | 1 | 3.00 | 20,000 |
| 2015 | 1 | 3.00 | 23,000 |
| 2015 | 2 | 3.00 | 67,000 |
| 2015 | 1 | 6.00 | 80,000 |
| 2015 | 1 | 9.00 | 40,000 |
| 2016 | 1 | 4.00 | 98,000 |
| 2016 | 1 | 7.00 | 34,000 |
| 2016 | 1 | 7.00 | 15,000 |
| 2016 | 2 | 7.00 | 45,000 |
| 2016 | 1 | 10.00 | 60,000 |
| 2017 | 1 | 4.50 | 54,000 |
| 2017 | 1 | 7.50 | 60,000 |
| 2017 | 1 | 10.50 | 50,000 |
| 2017 | 2 | 10.50 | 54,568 |
你要计算加权销售额,逻辑是:折扣 × 对应销售额 ÷ 年度总销售额。当前用的DAX公式:
- 年度总销售额:
TOTAL_SALES_YEAR = CALCULATE(SUM([sales]), ALLEXCEPT(Sheet1,Sheet1[year]))
- 加权销售额:
WEIGHTED_SALES = [discount] * [sales] / [TOTAL_SALES_YEAR]
问题在于:全渠道时计算正确,但筛选渠道1/渠道2后,年度总销售额还是全渠道的数值,导致加权销售额算错。
问题根源
你用的ALLEXCEPT(Sheet1,Sheet1[year])会清除除了年份之外的所有筛选器,包括你手动选的渠道筛选。这就相当于不管你选了哪个渠道,公式都强制忽略这个筛选,只算全渠道的年度总销售额,自然就不符合需求了。
解决方案:调整DAX公式保留渠道筛选
我们需要让TOTAL_SALES_YEAR保留当前的渠道筛选,只计算当前选中渠道+对应年度的总销售额。这里给你两种简单有效的写法:
方案1:扩展ALLEXCEPT的保留列
直接把channel也加入到ALLEXCEPT的保留列表里,这样公式就会保留年份和渠道的筛选上下文:
TOTAL_SALES_YEAR = CALCULATE(SUM([sales]), ALLEXCEPT(Sheet1, Sheet1[year], Sheet1[channel]))
这个写法最简洁,适合你的场景——它会清除除了年份、渠道之外的所有筛选(如果有其他维度的话),完全符合你要的效果。
方案2:用ALLSELECTED明确保留用户筛选
如果你想更直观地控制筛选上下文,可以用ALLSELECTED来保留用户当前的所有筛选,再限定到当前年度:
TOTAL_SALES_YEAR = CALCULATE( SUM([sales]), FILTER( ALLSELECTED(Sheet1), Sheet1[year] = MAX(Sheet1[year]) ) )
这个写法的好处是,如果以后你加了其他筛选维度(比如产品、区域),它会自动保留那些筛选,不用修改公式。
验证效果
修改完公式后,你再测试:
- 选全渠道:年度总销售额还是该年度所有渠道的总和,加权销售额正确;
- 选渠道1:年度总销售额变成该年度渠道1的总和,加权销售额基于这个数值计算;
- 选渠道2:同理,总销售额是渠道2的年度总和,加权销售额正确。
如果你的模型以后加了其他维度,只要调整ALLEXCEPT的保留列,或者用方案2的写法,就能轻松适配。
内容的提问来源于stack exchange,提问作者s-heins
相关产品推荐
相关产品推荐

