自动存在的概念将多维数据集空间限制为那些实际存在于数据集中的单元格,与那些通过将同一层次结构中的属性层次成员进行所有可能组合而可能存在的单元格形成对比。 这是因为一个属性层次结构的成员不能与同一维度中另一个属性层次结构的成员一起存在。 当在 SELECT 语句中使用同一维度的两个或多个属性层次结构时,Analysis Services 将计算属性的表达式,以确保这些属性的成员正确限制为满足所有其他属性的条件。
例如,假设你正在使用地理维度中的属性。 如果有一个表达式返回 City 属性中的所有成员,另一个表达式将国家/地区的成员限制为欧洲所有国家/地区,则这将导致 City 成员仅限于属于欧洲国家/地区的城市。 这是因为 Analysis Services 的自动存在特征。 自动存在仅适用于同一维度中的属性,因为它尝试阻止其他属性表达式包含一个属性表达式中排除的维度记录。 可以将自动存在理解为在维度行上不同行属性表达式的交集结果。
单元格存在
以下这些单元格始终存在:
在与同一维度中其他层次结构的成员交叉时,每个层次结构的 (All) 成员。
当计算成员与其非计算成员的兄弟姐妹交叉时,或者与其非计算成员的兄弟姐妹的父母或后代交叉时。
提供不存在的单元格
非存在的单元格是指系统在响应请求或计算时,针对多维数据集中不存在的单元格所提供的单元格。 例如,如果你有一个多维数据集,该多维数据集具有 City 属性层次结构和属于 Geography 维度的国家/地区属性层次结构,并且具有 Internet Sales Amount 度量值,则此多维数据集的空间仅包含彼此存在的成员。 例如,如果 City 属性层次结构包括纽约、伦敦、巴黎、东京和墨尔本的城市;国家/地区属性层次结构包括美国、英国、法国、日本和澳大利亚等国家/地区:然后,多维数据集的空间不包括巴黎和美国交汇处的空间(单元格)。
查询不存在的单元格时,非现有单元格返回 null;也就是说,它们不能包含计算,并且不能定义写入此空间的计算。 例如,以下语句包括不存在的单元格。
SELECT [Customer].[Gender].[Gender].Members ON COLUMNS,
{[Customer].[Customer].[Aaron A. Allen]
,[Customer].[Customer].[Abigail Clark]} ON ROWS
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
注释
此查询使用 Members (Set) (MDX) 函数返回列轴上的 Gender 属性层次结构的成员集,并将此集与行轴上 Customer 属性层次结构中的指定成员集交叉。
执行上一个查询后,Aaron A. Allen 和 Female 相交处的单元格显示为空值。 同样,阿比盖尔·克拉克和男性交集处的单元格显示空值。 这些单元格不存在且不能包含值,但不存在的单元格可以出现在查询返回的结果中。
使用 Crossjoin(MDX) 函数从同一维度的属性层次结构中返回成员的交叉积时,自动存在机制会将返回的元组限制为实际存在的元组集,而不是返回完整的笛卡尔积。 例如,运行并检查以下查询的执行结果。
SELECT CROSSJOIN
(
{[Customer].[Country].[United States]},
[Customer].[State-Province].Members
) ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
注释
请注意,0 用于指定列轴,即轴(0)的简写-即列轴。
上一个查询仅返回查询中每个属性层次结构中相互存在的成员的单元格。 还可以使用 Crossjoin (MDX) 函数的新 * 变体编写上一个查询。
SELECT
[Customer].[Country].[United States] *
[Customer].[State-Province].Members
ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
还可以采用以下方式编写上一个查询:
SELECT [Customer].[State-Province].Members
ON 0
FROM [Adventure Works]
WHERE (Measures.[Internet Sales Amount],
[Customer].[Country].[United States])
返回的单元格值是相同的,尽管结果集中的元数据将有所不同。 例如,在使用上一个查询时,“Country”层次结构已移动到筛选器轴(即 WHERE 子句中),因此不会在结果集中显式显示。
上述三个查询中的每一个都演示了 SQL Server Analysis Services 中自动存在的行为的影响。
深度与浅层自我存在
自动存在可应用于表达式为 Deep 或 Shallow。
Deep Autoexists 表示在应用切片器表达式、轴中的子选择表达式等之后,将评估所有表达式以达到可能的最深空间维度。
Shallow Autoexists 表示在当前表达式之前计算外部表达式,并将这些结果传递给当前表达式。 默认设置为深度自动存在。
以下场景和示例有助于说明不同类型的Autoexistss。 在以下示例中,将创建两个集:一个作为计算表达式,另一个作为常量表达式。
//Obtain the Top 10 best reseller selling products by Name
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'
set Preferred10Products as '
{[Product].[Model Name].&[Mountain-200],
[Product].[Model Name].&[Road-250],
[Product].[Model Name].&[Mountain-100],
[Product].[Model Name].&[Road-650],
[Product].[Model Name].&[Touring-1000],
[Product].[Model Name].&[Road-550-W],
[Product].[Model Name].&[Road-350-W],
[Product].[Model Name].&[HL Mountain Frame],
[Product].[Model Name].&[Road-150],
[Product].[Model Name].&[Touring-3000]
}'
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,
Top10SellingProducts on 1
from [Adventure Works]
获取的结果集为:
| 经销商销售金额 | 折扣金额 | PCT 折扣 | |
| Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
| Road-250 | $9,377,457.68 | $4,032.47 | 0.04% |
| Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
| Road-650 | $7,442,141.81 | $39,698.30 | 0.53% |
| Touring-1000 | $6,723,794.29 | $166,144.17 | 2.47% |
| Road-550-W | $3,668,383.88 | $1,901.97 | 0.05% |
| Road-350-W | $3,665,932.31 | $20,946.50 | 0.57% |
| HL 山地框架 | $3,365,069.27 | $174.11 | 0.01% |
| Road-150 | $2,363,805.16 | $0.00 | 0.00% |
| Touring-3000 | $2,046,508.26 | $79,582.15 | 3.89% |
获取的产品集似乎与 Preferred10Products 相同;因此,验证 Preferred10Products 集:
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'
set Preferred10Products as '
{[Product].[Model Name].&[Mountain-200],
[Product].[Model Name].&[Road-250],
[Product].[Model Name].&[Mountain-100],
[Product].[Model Name].&[Road-650],
[Product].[Model Name].&[Touring-1000],
[Product].[Model Name].&[Road-550-W],
[Product].[Model Name].&[Road-350-W],
[Product].[Model Name].&[HL Mountain Frame],
[Product].[Model Name].&[Road-150],
[Product].[Model Name].&[Touring-3000]
}'
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,
Preferred10Products on 1
from [Adventure Works]
根据以下结果,这两个列表(Top10SellingProducts,Preferred10Products)是一样的。
| 经销商销售金额 | 折扣金额 | PCT 折扣 | |
| Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
| Road-250 | $9,377,457.68 | $4,032.47 | 0.04% |
| Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
| Road-650 | $7,442,141.81 | $39,698.30 | 0.53% |
| Touring-1000 | $6,723,794.29 | $166,144.17 | 2.47% |
| Road-550-W | $3,668,383.88 | $1,901.97 | 0.05% |
| Road-350-W | $3,665,932.31 | $20,946.50 | 0.57% |
| HL 山地车架 | $3,365,069.27 | $174.11 | 0.01% |
| Road-150 | $2,363,805.16 | $0.00 | 0.00% |
| Touring-3000 | $2,046,508.26 | $79,582.15 | 3.89% |
以下示例将说明深度自动存在的概念。 在本示例中,我们正按 [Product].[Product Line] 属性过滤位于 [Mountain] 组中的 Top10SellingProducts。 请注意,切片器和轴这两个属性都属于同一维度 [Product]。
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'
// Preferred10Products set removed for clarity
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,
Top10SellingProducts on 1
from [Adventure Works]
where [Product].[Product Line].[Mountain]
生成以下结果集:
| 经销商销售金额 | 折扣金额 | PCT 折扣 | |
| Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
| Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
| HL 山框架 | $3,365,069.27 | $174.11 | 0.01% |
| Mountain-300 | $1,907,249.38 | $876.95 | 0.05% |
| Mountain-500 | $1,067,327.31 | $17,266.09 | 1.62% |
| Mountain-400-W | $592,450.05 | $303.49 | 0.05% |
| LL 山框 | $521,864.42 | $252.41 | 0.05% |
| ML Mountain Frame-W | $482,953.16 | $206.95 | 0.04% |
| ML Mountain Frame | $343,785.29 | $161.82 | 0.05% |
| 女子户外登山短裤 | $260,304.09 | $6,675.56 | 2.56% |
在上述结果集中,我们有 7 名新人进入 Top10SellingProducts 榜单,而 Mountain-200、Mountain-100 和 HL Mountain Frame 已移至榜单的顶部。 在之前的结果集中,这三个值是交错排列的。
这称为 Deep Autoexists,因为计算 Top10SellingProducts 集以满足查询的切片条件。 Deep Autoexists 表示在应用切片器表达式、轴中的子选择表达式等以后,所有表达式将被计算,以便在可用的空间中达到尽可能深的层次。
但是,人们可能希望能够对 Top10SellingProducts 进行分析,这相当于 Preferred10Products,如以下示例所示:
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'
set Preferred10Products as '
{[Product].[Model Name].&[Mountain-200],
[Product].[Model Name].&[Road-250],
[Product].[Model Name].&[Mountain-100],
[Product].[Model Name].&[Road-650],
[Product].[Model Name].&[Touring-1000],
[Product].[Model Name].&[Road-550-W],
[Product].[Model Name].&[Road-350-W],
[Product].[Model Name].&[HL Mountain Frame],
[Product].[Model Name].&[Road-150],
[Product].[Model Name].&[Touring-3000]
}'
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,
Preferred10Products on 1
from [Adventure Works]
where [Product].[Product Line].[Mountain]
生成以下结果集:
| 经销商销售金额 | 折扣金额 | PCT 折扣 | |
| Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
| Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
| HL 山框架 | $3,365,069.27 | $174.11 | 0.01% |
在上述结果中,切片生成了一个结果,其中仅包含那些既属于 [Product].[Product Line] 内的 [Mountain] 组,又在 Preferred10Products 列表中的产品。正如预期的那样,因为 Preferred10Products 是一个常量表达式。
此结果集也被理解为浅层自动存在。 这是因为表达式是在切片子句之前计算的。 在前面的示例中,表达式是用于说明目的的常量表达式,用于介绍概念。
在会话级别,可以使用连接字符串属性 Autoexists 修改自动存在的行为。 以下示例首先打开一个新会话并将 Autoexists=3 属性添加到连接字符串。 必须打开一个新连接才能执行该示例。 使用“自动存在”设置建立连接后,该连接将一直有效,直到该连接完成。
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'
//Preferred10Products set removed for clarity
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,
Top10SellingProducts on 1
from [Adventure Works]
where [Product].[Product Line].[Mountain]
以下结果集现在显示了 Autoexists 的浅表行为。
| 经销商销售金额 | 折扣金额 | PCT 折扣 | |
| Mountain-200 | $14,356,699.36 | $19,012.71 | 0.13% |
| Mountain-100 | $8,568,958.27 | $139,393.27 | 1.63% |
| HL 山地车架 | $3,365,069.27 | $174.11 | 0.01% |
可以使用连接字符串中的 AUTOEXISTS=[1|2|3] 参数修改 Autoexists 行为;请参阅 支持的 XMLA 属性(XMLA) 和 ConnectionString 参数用法。
另请参阅
MDX中的关键概念(分析服务)
Cube 空间
元组
使用成员、元组和集(MDX)
视觉总计和非视觉总计
MDX 语言参考 (MDX)
多维表达式(MDX)参考