如何在DAX中实现同表子查询,完成SQL到DAX的转换
SQL转DAX:实现同表子查询(NOT EXISTS)的解决方案
原SQL逻辑梳理
原SQL要生成包含table2[code]、table2[text]和New列的结果集,其中New列统计table1中满足以下条件的记录数:
- 记录的
created时间≤2023-06-24 17:00:00,且col1为空或>该时间、col2为空或>该时间 - 记录的
code与table2当前行的code匹配 - 不存在另一条
table1记录(记为B),满足:- B的
created时间≤2023-07-24 17:00:00 - B的
col1为空或>该时间、col2为空或>该时间 - B的
col3与当前table1记录(记为A)的col3相等
- B的
现有DAX的问题
你写的DAX存在两个核心问题:
- 末尾重复了
ORDER BY table2[created],属于语法错误 - 处理
NOT EXISTS的部分,FILTER(table1, ... && table1[col3] = table1[col3])是恒成立的条件,没有关联到当前行的col3,无法模拟SQL中A.col3 = B.col3的关联逻辑
修正后的DAX代码
EVALUATE SUMMARIZECOLUMNS( table2[code], table2[text], "New", CALCULATE( COUNTROWS(table1), FILTER( table1, table1[created] <= DATETIME(2023, 6, 24, 17, 0, 0) && (ISBLANK(table1[col1]) || table1[col1] > DATETIME(2023, 6, 24, 17, 0, 0)) && (ISBLANK(table1[col2]) || table1[col2] > DATETIME(2023, 6, 24, 17, 0, 0)) && table1[code] = RELATED(table2[code]) && ISEMPTY( VAR CurrentCol3 = table1[col3] RETURN FILTER( table1, table1[created] <= DATETIME(2023, 7, 24, 17, 0, 0) && (ISBLANK(table1[col1]) || table1[col1] > DATETIME(2023, 7, 24, 17, 0, 0)) && (ISBLANK(table1[col2]) || table1[col2] > DATETIME(2023, 7, 24, 17, 0, 0)) && table1[col3] = CurrentCol3 ) ) ) ) ) ORDER BY table2[created]
关键修正说明
- 用VAR捕获当前行col3:在处理
NOT EXISTS的FILTER内部,通过VAR CurrentCol3 = table1[col3]捕获当前迭代的table1行的col3值,再在内部FILTER中匹配table1[col3] = CurrentCol3,完美对应SQL中A.col3 = B.col3的关联逻辑 - 修正日期函数:DAX中生成带时分秒的日期要用
DATETIME(),而不是DATE()(DATE()仅生成年月日) - 清理语法错误:移除重复的
ORDER BY,将排序逻辑放在EVALUATE结果的最后 - RELATED的使用前提:确保
table1和table2之间已建立基于code列的关系;如果没有关系,需将table1[code] = RELATED(table2[code])替换为table1[code] = table2[code],并确保上下文正确
内容的提问来源于stack exchange,提问作者Tina
相关产品推荐
相关产品推荐

