从数据到信息
从信息到洞察

理解 CROSSJOIN

CROSSJOIN 函数在两个或多个表之间生成笛卡尔乘积。你可以使用任何表表达式作为参数;只需将它们全部放入参数中,如以下语法所示:

CROSSJOIN

CROSSJOIN ( <table1>, <table2>, [<tableN> ... ] )

CROSSJOIN 返回一个表,其中包含参数中所有表的所有行的笛卡尔积,新表中的列包含所有参数表的所有列。

参数 属性 描述
Table 可重复 参与 CROSSJOIN 计算的表

笛卡尔乘积示意图

注意

  • 来自表参数的列名不能有重复,否则将返回错误
  • CROSSJOIN 返回表的总行数等于所有参数表行数的乘积,总列数是所有表中列数的总和。例如,如果表 A 是某学校学生的集合,表 B 是该学校所有课程的集合,则 A 与 B 的笛卡尔积表示所有可能的选课情况。表 A 是所有声母的集合,表 B 是所有韵母的集合,那么 A 和 B 的笛卡尔积就是所有可能的汉字全拼。

示例用法

生成多列的组合值是 CROSSJOIN 的一个典型应用,如以下示例所示:

EVALUATE
CROSSJOIN (
    VALUES ( 'Product'[Stock Type] ),
    VALUES ( 'Product Category'[Category] )
)

结果包含了一个表的所有行与其他表的所有行的全部组合,包括所有表的所有列。如果 CROSSJOIN 中使用的两个或更多表具有相同的列名,则必须使用完全限定名(包括表名和列名)来标识列,如下例所示:

EVALUATE
CROSSJOIN ( 'Product Category', 'Product Subcategory' )

两个表都包含 ProductCategoryKey 列,为了避免出现歧义,这一列在结果中有两个完全不同的限定名称。

以上是引擎自动生成的结果,如果你在 Power BI Desktop 中使用新建表的方式创建以上查询,会收到列名重复的提示。当你需要在 CROSSJOIN 的结果中包含同名列的时候,为了避免完全限定名称产生重复,必须提前重命名该列。例如,以下查询返回产品库存类型与其自身的所有组合:

EVALUATE
CROSSJOIN (
    VALUES ( Product[Stock Type] ),
    SELECTCOLUMNS (
        VALUES ( Product[Stock Type] ),
        "Alternate Type", Product[Stock Type]
    )
)

正如你在结果中看到的,结果中的两列具有相同的沿袭,在数据沿袭一文中你将了解到,CROSSJOIN 生成的表可以具备多个表的沿袭,在用作筛选器参数时可以筛选多张表。

两列的数据沿袭相同

生成内连接的表

以下查询生成表 a 和表 b 的内连接(inner join)结果

EVALUATE
FILTER (
    CROSSJOIN ( a, b ),
    a[key] = b[key]
)

5
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
2 评论数
3 被回复的评论
3 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
成员
做一名学霸

注意:来自表参数的列名不能有重复,否则将返回错误。

如果 CROSSJOIN 中使用的两个或更多表具有相同的列名,则必须使用完全限定名(包括表名和列名)来标识列。

老师好,以上摘自文中的内容,一个强调表参数的列名不能重复,后面又说使用完全限定名的话可以有相同的列名。。。
请问,CROSSJOIN函数的表参数中,到底可以有相同的列名不?

成员
Elly

“必须使用完全限定名(包括表名和列名)来标识列”,可是示例的代码只有表名啊,看不明白

DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数