DAX表达式得到两组的交集

时间:2015-10-28 07:41:25

标签: action dax

示例场景:根据注册表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  

1 个答案:

答案 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 +
    ")
)"