能否将多时间智能筛选的DistinctCount合并为单个CALCULATE语句?
DAX筛选逻辑简化问题
需求是统计当前周期有1条记录、上上个周期无记录的客户数量。目前用嵌套CALCULATE的写法实现,想知道能不能简化成单个CALCULATE(DISTINCTCOUNT(...))的形式。
当前使用的代码
CALCULATE( ( CALCULATE( DISTINCTCOUNT('Sales Invoice'[Customer Code]), DATESBETWEEN(DimDate[Date], EDATE(MIN(DimDate[Date]), -2), EDATE(MAX(DimDate[Date]), -1)) ) = 0 && CALCULATE( DISTINCTCOUNT('Sales Invoice'[Customer Code]), DATESBETWEEN(DimDate[Date], EDATE(MIN(DimDate[Date]), -0), EDATE(MAX(DimDate[Date]), -0)) ) = 1 )
期望的简化代码(无法直接生效)
CALCULATE( DISTINCTCOUNT('Sales Invoice'[Customer Code]), DATESBETWEEN(DimDate[Date], EDATE(MIN(DimDate[Date]), -2), EDATE(MAX(DimDate[Date]), -1)) = 0 && DATESBETWEEN(DimDate[Date], EDATE(MIN(DimDate[Date]), 0), EDATE(MAX(DimDate[Date]), 0)) = 1 )
解答
你期望的写法不能直接运行,因为DATESBETWEEN是生成筛选上下文的函数,本身不返回数值,没法用=0或=1判断客户记录数。不过确实可以简化成更简洁的单CALCULATE结构,核心思路是先提取所有客户,再筛选符合两个周期条件的客户,最后统计数量:
CALCULATE( DISTINCTCOUNT('Sales Invoice'[Customer Code]), FILTER( VALUES('Sales Invoice'[Customer Code]), -- 上上个周期无记录 CALCULATE( COUNTROWS('Sales Invoice'), DATESBETWEEN(DimDate[Date], EDATE(MIN(DimDate[Date]), -2), EDATE(MAX(DimDate[Date]), -1)) ) = 0 && -- 当前周期有1条记录 CALCULATE( COUNTROWS('Sales Invoice'), DATESBETWEEN(DimDate[Date], MIN(DimDate[Date]), MAX(DimDate[Date])) ) = 1 ) )
也可以用DISTINCTCOUNT替代COUNTROWS,但COUNTROWS判断记录数时更直接。这个写法把客户筛选逻辑放到FILTER中,外层用单个CALCULATE统计符合条件的客户数,比原来的嵌套结构更清晰,逻辑和需求完全一致。
另外注意你原代码里EDATE(MIN(...), -0)可以直接写成MIN(DimDate[Date]),没必要多套一层EDATE。
内容的提问来源于stack exchange,提问作者Jayz
相关产品推荐
相关产品推荐

