USERELATIONSHIP
指定要在特定计算中使用的关系,作为 columnName1 和 columnName2 之间存在的关系。
语法
USERELATIONSHIP(<columnName1>,<columnName2>)
parameters
术语 | 定义 |
---|---|
columnName1 |
使用标准 DAX 语法和完全限定的现有列的名称,通常表示要使用的关系的多端:如果参数按相反顺序提供,则函数会在使用参数之前交换它们。 此参数不能是表达式。 |
columnName2 |
使用标准 DAX 语法和完全限定的现有列的名称,通常表示要使用的关系的一侧或查找端;如果参数按相反顺序提供,则函数会在使用参数之前交换它们。 此参数不能是表达式。 |
返回值
该函数不返回任何值;该函数仅在计算期间启用指示的关系。
备注
USERELATIONSHIP 只能在采用筛选器作为参数的函数中使用,例如:CALCULATE、CALCULATETABLE、CLOSINGBALANCEMONTH、CLOSINGBALANCEQUARTER、CLOSINGBALANCEYEAR、OPENINGBALANCEMONTH、OPENINGBALANCEQUARTER、OPENINGBALANCEYEAR、TOTALMTD、TOTALQTD 和 TOTALYTD 函数。
为包含度量值的表定义行级别安全性时,不能使用 USERELATIONSHIP。 例如,如果为 DimCustomer 定义了行级别安全性,
CALCULATE(SUM([SalesAmount]), USERELATIONSHIP(FactInternetSales[CustomerKey], DimCustomer[CustomerKey]))
将返回错误。USERELATIONSHIP 使用模型中的现有关系,通过它们的终点列标识关系。
在 USERELATIONSHIP中,关系的状态并不重要:也就是说,关系是否处于活动状态,都不会影响函数的使用。 即使关系处于非活动状态,它也将被使用并替代模型中可能存在但函数参数中未提及的任何其他活动关系。
如果命名为参数的任何列不属于关系或自变量属于不同的关系,则返回错误。
如果需要多个关系才能将表 A 联接到计算中的表 B,则必须在不同的 USERELATIONSHIP 函数中指示每个关系。
如果 CALCULATE 表达式是嵌套的,并且多个 CALCULATE 表达式包含一个 USERELATIONSHIP 函数,则最内部的 USERELATIONSHIP 是冲突或歧义时占上风的表达式。
最多可以嵌套 10 个 USERELATIONSHIP 函数;但是,表达式可能具有更深层次的嵌套,即。下面的示例表达式嵌套了 3 个级别,但对于 USERELATIONSHIP只有 2 个级别:
=CALCULATE(CALCULATE( CALCULATE( <anyExpression>, USERELATIONSHIP( t1[colA], t2[colB])), t99[colZ]=999), USERELATIONSHIP( t1[colA], t2[colA]))
。对于 1 对 1 的关系,USERELATIONSHIP 只会以一个方向激活关系。 具体而言,筛选器只能从 columnName2的表流向 columnName1表。 如果需要双向交叉筛选,则可以在同一计算中使用具有相反方向的两个 USERELATIONSHIP。 例如,
CALCULATE(..., USERELATIONSHIP(T1[K], T2[K]), USERELATIONSHIP(T2[K], T1[K]))
。
示例
以下示例演示如何重写 InternetSales 和 DateTime 表之间的默认活动关系。 OrderDate 列、InternetSales 表中和 DateTime 表中的 Date 列之间存在默认关系。
若要计算 Internet 销售的总和并允许通过 ShippingDate 而不是传统的 OrderDate 进行切片,请使用以下表达式创建度量值 [InternetSales by ShippingDate] :
= CALCULATE(SUM(InternetSales[SalesAmount]), USERELATIONSHIP(InternetSales[ShippingDate], DateTime[Date]))
InternetSales[ShipmentDate] 与 DateTime[Date] 之间的关系必须存在,不应为活动关系;此外,InternetSales[OrderDate] 与 DateTime[Date] 之间的关系应存在,应为活动关系。