示例场景:根据注册表Enroll(CourseId,StudentId,...)和学生表Student(StudentId,国籍,......),查找至少包含加拿大和美国学生的课程。
我定义了一个行集动作,它使用以下DAX表达式来获取课程ID
evaluate (
intersect(
calculatetable(
summarize('Enrol','Enrol'[CourseId])
, <Filter 1>
)
,
calculatetable(
summarize('Enrol','Enrol'[CourseId])
, <Filter 2>
)
)
)
但这不起作用。我查看了intersect operator的文档,看起来我必须遗漏一些明显的东西。任何帮助是极大的赞赏。表达式如下
evaluate (
calculatetable(
summarize('Enrol','Enrol'[CourseId])
, <Filter 1>
)
)
单独评估时,会给出我想要的结果集。不知何故,一个简单的交叉点总会导致错误说
Executing the query ...
Query (1, 10) This is not a valid DAX expression.
Execution complete
答案 0 :(得分:0)
基于this post的答案,最后通过嵌套的CalculateTable()函数解决了问题。
evaluate (
CalculateTable(
Summarize('Enrol','Enrol'[CourseId]),
CalculateTable(
Values('Enrol'[CourseId]),
<Filter 1>
),
<Filter 2>
)
)
此模式适用于任何1:M关系,您需要在1侧找到匹配多方的多个条件的实体。另一个例子可能是找到指定了多个项目的订单。
也许值得注意的是,我也尝试使用contains函数来解决这个问题:
evaluate (
calculatetable(
'Courses'
, contains(
RelatedTable('Enrol')
,'Enrol'[StudentId]
,<StudentId for Canadians>
)
, contains(
RelatedTable('Enrol')
,'Enrol'[StudentId]
,<StudentId for Americans>
)
)
)
此解决方案因错误
而失败A function 'MINX' has been used in a True/False expression that is used as a table filter expression. This is not allowed.
我不知道MINX
必须在这做什么。上述帖子中报告了同样的错误。
我知道调试行集动作MDX表达式很痛苦。这是我最终使用的完整行集动作表达式(是的,我使用Marco的Basket Analysis pattern来构建多维数据集),
"
Evaluate(
CalculateTable(
Summarize('Enrol','Enrol'[CourseId]),
CalculateTable(
Values('Enrol'[CourseId])
,'Enrol'[StudentId] = " + {Existing [Student Filter].[StudentId].[StudentId].Members}.Item(0).Name +
"),
'Enrol'[StudentId] = " + {Existing [Students].[StudentId].[StudentId].Members}.Item(0).Name +
")
)"