ALLNOBLANKROW 函数
从关系的父表中,返回除空白行之外的所有行,或某一列中除空白行之外的所有非重复值,并且忽略可能存在的所有上下文筛选器。
语法
ALLNOBLANKROW(<table>|<column>)
参数
术语 |
定义 |
---|---|
table |
要删除其所有上下文筛选器的表。 |
column |
要删除其所有上下文筛选器的列。 |
只有一个参数必须传递;该参数是表或列。
返回值
表(在传递的参数是表时)或值的列(在传递的参数是列时)。
注释
ALLNOBLANKROW 函数只筛选当子表中的一行或多行具有与父列不匹配的值时关系中的父表将显示的空白行。 有关详细说明,请参阅下面的示例。
下表总结了 DAX 中提供的 ALL 的变体及其差别:
函数和用法 |
说明 |
---|---|
ALL(Column) |
删除表中指定列的所有筛选器;表中针对其他列的所有其他筛选器仍应用。 |
ALL(Table) |
从指定表中删除所有筛选器。 |
ALLEXCEPT(Table,Col1,Col2...) |
除了指定列,覆盖表中所有上下文筛选器。 |
ALLNOBLANK(table|column) |
从关系的父表中,返回除空白行之外的所有行,或某一列中除空白行之外的所有非重复值,并且忽略可能存在的所有上下文筛选器 |
有关 ALL 函数的工作方式的一般说明以及使用 ALL(Table) 和 ALL(Column) 的分步说明示例,请参阅 ALL 函数。
示例
在示例数据中,ResellerSales_USD 表中有一行不包含任何值,因此该表不能与工作簿内关系中的任何父表相关。 您将在数据透视表中使用此表,以便查看空白行的行为以及如何处理对不相关数据的计数。
步骤 1:验证不相关数据
打开 PowerPivot 窗口,然后选择 ResellerSales_USD 表。 在 ProductKey 列中,筛选空白值。 将保留一行。 在该行中,除 SalesOrderLineNumber 之外的所有列值都应为空白。
步骤 2:创建数据透视表
创建一个新的数据透视表,然后将 datetime.[Calendar Year] 列拖动到“行标签”窗格。 下表显示了预期的结果:
行标签 |
---|
2005 |
2006 |
2007 |
2008 |
|
Grand Total |
请注意,2008 与 Grand Total 之间的空白标签。 此空白标签表示未知成员,这是所创建的特殊组,用于代表在父表中没有匹配值的所有子表值,在本示例中,即是 datetime.[Calendar Year] 列。
在数据透视表中看到此空白标签时,就知道在 datetime.[Calendar Year] 列的部分相关表中存在空白值或不匹配的值。 父表是显示该空白标签的表,但不匹配的行位于一个或多个子表中。
添加到此空白标签组中的行是与父表中的任何值都不匹配的值(例如,datetime 表中不存在的日期)或 Null 值(根本没有日期值)。 在本示例中,我们在子销售表的所有列中都放置了一个空白值。 父表中具有比子表中更多的值不会引发问题。
步骤 3:使用 ALL 和 ALLNONBLANK 计算行数
向 datetime 表中添加以下两个度量值,以计算表的行数:Countrows ALLNOBLANK of datetime、Countrows ALL of datetime。 下面的代码部分给出了可用来定义这些度量值的公式。
在空白数据透视表中,向行标签添加 datetime.[Calendar Year] 列,然后添加新创建的度量值。 结果应该如下表所示:
行标签 |
Countrows ALLNOBLANK of datetime |
Countrows ALL of datetime |
---|---|---|
2005 |
1280 |
1281 |
2006 |
1280 |
1281 |
2007 |
1280 |
1281 |
2008 |
1280 |
1281 |
|
1280 |
1281 |
Grand Total |
1280 |
1281 |
结果显示,表的行计数存在 1 行的差别。 但是,如果打开 PowerPivot 窗口并选择 datetime 表,则无法在该表中找到任何空白行,因为此处提及的特殊空白行是未知成员。
步骤 4:验证计数是否准确
为了证明 ALLNOBLANKROW 不对任何真正的空白行计数,只处理父表中的特殊空白行,请向 ResellerSales_USD 表添加以下两个度量值:Countrows ALLNOBLANKROW of ResellerSales_USD、Countrows ALL of ResellerSales_USD。
创建一个新的数据透视表,然后将 datetime.[Calendar Year] 列拖动到“行标签”窗格。 现在,添加刚刚创建的度量值。 结果应该如下所示:
行标签 |
Countrows ALLNOBLANKROW of ResellerSales_USD |
Countrows ALL of ResellerSales_USD |
---|---|---|
2005 |
60856 |
60856 |
2006 |
60856 |
60856 |
2007 |
60856 |
60856 |
2008 |
60856 |
60856 |
|
60856 |
60856 |
Grand Total |
60856 |
60856 |
现在,这两个度量值的结果相同。 这是因为,ALLNOBLANKROW 函数不对表中的真正空白行计数,只处理父表中在特殊情况下(当关系中的一个或多个子表包含不匹配值或空白值时)生成的空白行。
// Countrows ALLNOBLANK of datetime
= COUNTROWS(ALLNOBLANKROW('DateTime'))
// Countrows ALL of datetime
= COUNTROWS(ALL('DateTime'))
// Countrows ALLNOBLANKROW of ResellerSales_USD
=COUNTROWS(ALLNOBLANKROW('ResellerSales_USD'))
// Countrows ALL of ResellerSales_USD
=COUNTROWS(ALL('ResellerSales_USD'))