如何让SAMEPERIODLASTYEAR仅返回当前年度存在的产品上年销售额?
解决DAX计算上年同期销售额时筛选当前年度有销售产品的问题
嘿,这个场景我之前踩过坑!你现在的问题核心是:原来的DAX公式只切换到了上年同期的时间维度,但没有限制产品必须在当前年度有销售记录,所以才会把今年没卖的产品3也带出来。咱们来调整公式解决这个问题:
核心思路
先筛选出「当前年度有销售的产品集合」,再基于这个集合去计算它们的上年同期销售额,这样就能自动排除今年无销售的产品了。
具体解决方案
方法一:用变量先圈定当前年度有销售的产品(可读性强)
SamePeriodSalesLastYear = -- 第一步:定义变量,找出当前年度有销售的产品 VAR CurrentYearActiveProducts = FILTER( ALL(Product[Product]), -- 取所有产品维度 CALCULATE([Sum of ProductSales], DATESYTD(D_DATE[DATE])) > 0 -- 筛选今年YTD有销售的 ) -- 第二步:基于筛选后的产品集合计算上年同期销售额 RETURN CALCULATE( [Sum of ProductSales], SAMEPERIODLASTYEAR(D_DATE[DATE]), -- 切换到上年同期时间 CurrentYearActiveProducts -- 只保留今年有销售的产品 )
方法二:直接在CALCULATE里加筛选条件(更简洁)
如果觉得变量有点繁琐,也可以把筛选逻辑直接嵌入CALCULATE的筛选参数里:
SamePeriodSalesLastYear = CALCULATE( [Sum of ProductSales], SAMEPERIODLASTYEAR(D_DATE[DATE]), -- 筛选条件:当前产品在本年度有销售记录 FILTER( VALUES(Product[Product]), CALCULATE([Sum of ProductSales], DATESYTD(D_DATE[DATE])) > 0 ) )
适配报表筛选的灵活版本
如果你的报表是通过切片器等方式选择「当前时间段」(不是固定自然年),可以把DATESYTD换成ALLSELECTED(D_DATE[DATE]),确保筛选的是用户所选时间段内有销售的产品:
SamePeriodSalesLastYear = CALCULATE( [Sum of ProductSales], SAMEPERIODLASTYEAR(D_DATE[DATE]), FILTER( VALUES(Product[Product]), CALCULATE([Sum of ProductSales], ALLSELECTED(D_DATE[DATE])) > 0 ) )
效果验证
调整后,产品3因为当前年度没有销售记录,会被自动排除,最终结果就会是你期望的:
| SamePeriodSalesLastYear |
|---|
| $10 |
| $12 |
内容的提问来源于stack exchange,提问作者ISW
相关产品推荐
相关产品推荐

