You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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代码问题

  1. 内层SWITCH完全多余,徒增逻辑复杂度
  2. CALCULATE(MAX('Appointment History'[SKEY_ACTUAL_END_DATE] = -1, (30990101)))存在语法错误:MAX仅接受单个表达式参数,不能同时传入布尔判断和数值
  3. 逻辑嵌套混乱,未利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:52:52