DAX新手求助:含CASE WHEN与PARTITION BY的SQL转DAX实现
将带CASE WHEN和PARTITION BY的SQL转换为DAX
需求回顾
按Appointment ID分组处理:
- 若组内存在
SKEY_ACTUAL_END_DATE = -1的记录,返回-1(表示任务未结束) - 否则返回该组内
SKEY_ACTUAL_END_DATE的最大值
你的DAX代码问题
- 内层
SWITCH完全多余,徒增逻辑复杂度 CALCULATE(MAX('Appointment History'[SKEY_ACTUAL_END_DATE] = -1, (30990101)))存在语法错误:MAX仅接受单个表达式参数,不能同时传入布尔判断和数值- 逻辑嵌套混乱,未利用DAX变量特性拆分逻辑,可读性差
正确的DAX实现
方法一:直接判断组内是否存在-1(更直观)
SKEY_APPOINTMENT_END_DATE = VAR HasUnfinished = CALCULATE( COUNTROWS('Appointment History'), ALLEXCEPT('Appointment History', 'Appointment History'[Appointment ID]), 'Appointment History'[SKEY_ACTUAL_END_DATE] = -1 ) > 0 VAR MaxEndDate = CALCULATE( MAX('Appointment History'[SKEY_ACTUAL_END_DATE]), ALLEXCEPT('Appointment History', 'Appointment History'[Appointment ID]) ) RETURN IF(HasUnfinished, -1, MaxEndDate)
HasUnfinished:用ALLEXCEPT锁定当前Appointment ID的上下文,统计组内是否存在值为-1的记录MaxEndDate:计算当前分组的最大结束日期- 最后通过
IF分支返回对应结果
方法二:模仿原SQL的替换逻辑
SKEY_APPOINTMENT_END_DATE = VAR MaxReplaced = CALCULATE( MAX( IF('Appointment History'[SKEY_ACTUAL_END_DATE] = -1, 30990101, 'Appointment History'[SKEY_ACTUAL_END_DATE]) ), ALLEXCEPT('Appointment History', 'Appointment History'[Appointment ID]) ) RETURN IF(MaxReplaced = 30990101, -1, MaxReplaced)
MaxReplaced:先将组内的-1替换为30990101,再取替换后的最大值- 若最大值等于30990101,说明组内存在-1的记录,返回-1;否则返回原最大值
内容的提问来源于stack exchange,提问作者Abi
相关产品推荐
相关产品推荐

