Ssas 为什么订单忽略子选择?

Ssas 为什么订单忽略子选择?,ssas,mdx,subquery,Ssas,Mdx,Subquery,我在AnalysisServices 2005(和2008 R2)中遇到了一些令人困惑的行为,如果有人能解释为什么会发生这种情况,我将不胜感激。为了回答这个问题,我复制了针对AdventureWorks立方体的行为 鉴于此MDX: SELECT [Customer].[Education].[(All)].ALLMEMBERS ON COLUMNS, Order(DrillDownLevel({[Customer].[Customer Geography].[All Customers]

我在AnalysisServices 2005(和2008 R2)中遇到了一些令人困惑的行为,如果有人能解释为什么会发生这种情况,我将不胜感激。为了回答这个问题,我复制了针对AdventureWorks立方体的行为

鉴于此MDX:

SELECT [Customer].[Education].[(All)].ALLMEMBERS ON COLUMNS,
    Order(DrillDownLevel({[Customer].[Customer Geography].[All Customers]}), 
          ([Measures].[Internet Order Count]), 
          ASC) ON ROWS
FROM (SELECT {[Customer].[Education].&[Partial High School]} ON COLUMNS FROM [Adventure Works])
WHERE [Measures].[Internet Order Count];

查询使用行上的有序集进行计算:
所有客户:2136
德国:269 法国:298 加拿大:304 联合王国:311
美国:457
澳大利亚:497

但是,如果我在order语句中使用的元组中包含用于教育的All成员(或DEFAULT成员):

SELECT [Customer].[Education].[(All)].ALLMEMBERS ON COLUMNS,
        Order(DrillDownLevel({[Customer].[Customer Geography].[All Customers]}), 
              ([Measures].[Internet Order Count], [Customer].[Education].[All Customers]), 
              ASC) ON ROWS
FROM (SELECT {[Customer].[Education].&[Partial High School]} ON COLUMNS FROM [Adventure Works])
WHERE [Measures].[Internet Order Count];

然后,集合以明显不同的顺序返回:
所有客户:2136
法国:298 德国:269 联合王国:311
加拿大:304 澳大利亚:497 美国:459

请注意,法国和德国相对而言都是无序的。加拿大/英国和美国/澳大利亚也是如此。据我所知,它是在计算子多维数据集之前根据聚合排序的

为什么包含该成员(在第一个示例中,该成员应隐式位于元组中?)会导致order语句的计算结果超出子多维数据集的可视总计范围?Filter和TopCount等函数似乎具有相同的行为


干杯。

我不是SSAS专家,但这与

您正在覆盖订单函数评估中的子选择。注意,此行为取决于上下文(轴评估、计算成员和轴)。在您的示例中,上下文是轴求值期间的函数。该行为与轴的计算不同(一旦知道轴)。这很复杂,但事实就是这样

请注意,在与一些MDX专家讨论后,我们决定简化并不遵循此行为:始终应用subselect筛选器。

注意:请看我在何处更详细地解释了此行为

关于subselects的一篇好文章是Mosha的

注意使用subselect时会发生什么。隐式存在,并应用可视总计。关于您的体验,这里的关键信息是:

二,。如果没有坐标覆盖,则对物理度量值应用视觉总计,即使在表达式中也是如此。

在第一个查询中,SSAS默认应用可视总计。您可以将查询更改为不执行以下操作:

SELECT [Customer].[Education].[(All)].ALLMEMBERS ON COLUMNS,
    Order(DrillDownLevel({[Customer].[Customer Geography].[All Customers]}), 
          ([Measures].[Internet Order Count]), 
          ASC) ON ROWS
FROM NON VISUAL (SELECT {[Customer].[Education].&[Partial High School]} ON COLUMNS FROM [Adventure Works])
WHERE [Measures].[Internet Order Count];
SELECT语句中的NON VISUAL关键字告诉SSAS仅应用隐式Exists,而不应用VISUAL totals部分。查询的结果将与第二种情况相同,但您也将看到它排序依据的实数


因为您在第二个查询中显式覆盖了All成员,所以SSAS不会将可视合计应用于此表达式,并且不会按所有年份的合计金额对订单进行排序。但是,在评估非可视总计的顺序后,它仍然显示所选行度量的可视总计。

我的猜测是,由于这两个属性仅通过键相关(不存在直接关系)属性的结果交叉连接会在被聚合的关键成员上产生,这是不应用visualtotals的地方(这是使用子选择计算非VisualTotal的方法之一)

我构造了一个查询来演示交叉连接的结果:

WITH

MEMBER sortExpr as
AGGREGATE(Descendants([Customer].[Customer Geography].CurrentMember), [Measures].[Internet Order Count])

SELECT 
[Customer].[Education].[(All)].ALLMEMBERS 
*
{[Measures].[Internet Order Count], sortExpr} ON COLUMNS,
Order
(
    DrillDownLevel({[Customer].[Customer Geography].[All Customers]})
    ,sortExpr
    ,ASC
) ON ROWS
FROM 
(
    SELECT 
    {[Customer].[Education].&[Partial High School]} ON COLUMNS 
    FROM [Adventure Works]
)
;
编辑: 下面是另一个查询,该查询显示,一旦使用查询范围集(众所周知的解决方案)解决子选择问题,表达式就可以正确地使用属性覆盖:

感谢博扬在推特上提出这个问题。
关于这个问题,Hrvoje

这个答案的含义还不清楚。虽然这个问题显然与属性覆盖有关,但我看不出它是如何回答这个问题的。此外,它不依赖于上下文,说“行为不同于轴的评估”也没有意义——轴上没有不同的行为。很抱歉,但它似乎没有准确地解决问题。@Boyan,这是SSAS完成元组中缺失层次结构的方式,这取决于该元组的上下文(仔细阅读“属性覆盖”链接)@icCube:这与相关属性之间的属性覆盖有关。子选择不会更改当前坐标,因此不会覆盖任何内容。唯一正在发生的覆盖是在ORDER语句的第二个参数中对元组中的All成员的显式覆盖。“唯一正在发生的覆盖是对All成员的显式覆盖”,这就是我们所说的。它做了什么?对其余部分有什么影响?这是一个新的查询,带有新的结果,可以添加非可视的结果。适用于[所有人],但不会对[教育]层次结构产生预期结果(注意,他使用的是同一维度的两个层次结构)@isCube:你是什么意思?你尝试过吗?当然,它给出了预期的结果-它只显示了没有子选择过滤器/视觉总计的数量…也许你是对的,但不确定这是carp所寻找的。让他决定:-)他在寻找他的问题的答案。嘿,好吧,你在这里处理一个完全不同的问题。你的表达不仅与问题中的表达不一致,而且模糊了逻辑。为什么它们不相等?在这两种情况下,您在不同的元素中引入成员表达式,这些元素的计算方式不同。在第一种情况下,您将添加一个带有.CurrentMember的计算成员,它不受子选择的影响。在第二种情况下,您还引入了一个命名集,它在这方面有自己的优势。不过,感谢您添加您的想法,Hrvoje。
WITH

set sub as
[Customer].[Customer Geography].[Customer]

MEMBER sortExpr2 as
Aggregate(existing sub, [Measures].[Internet Order Count])

SELECT 
[Customer].[Education].[(All)].ALLMEMBERS 
*
{[Measures].[Internet Order Count], sortExpr2} ON COLUMNS,
Order
(
    DrillDownLevel({[Customer].[Customer Geography].[All Customers]})
    ,
    (
--      [Customer].[Customer Geography].CurrentMember,
        [Customer].[Education].[All Customers],
        sortExpr2
    )
    ,ASC
) ON ROWS
FROM 
(
    SELECT 
    {[Customer].[Education].&[Partial High School]} ON COLUMNS 
    FROM [Adventure Works]
)
;