为什么Order忽略subselect?

时间:2011-06-29 22:19:18

标签: ssas mdx subquery

我在Analysis Services 2005(和2008 R2)中遇到了一些令人困惑的行为,如果有人能解释为什么会这样,我会很感激。为了这个问题,我已经复制了针对Adventure Works多维数据集的行为。

鉴于此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];


查询使用行上的有序集进行求值:
所有客户:2,136
德国:269
法国:298
加拿大:304
英国:311
美国:457
澳大利亚:497

但是,如果我在订单声明中使用的元组中包含Education的All Member(或defaultmember):

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];


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

请注意,法国和德国相对于彼此无序。与加拿大/英国和美国/澳大利亚相同。据我所知,它是在评估子立方体之前基于聚合的排序。

为什么包含这个成员(应该隐含在第一个例子中的元组中?)会导致order语句的评估看到子多维数据集的可视化总数之外? Filter和TopCount等函数似乎具有相同的行为。

干杯。

3 个答案:

答案 0 :(得分:2)

我的猜测是,由于2个属性仅与密钥相关(不存在直接关系),因此产生的属性交叉连接会导致聚合的关键成员,这就是未应用visualtotals的地方(这是其中一种方式)如何用子选择计算非视觉总数。

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

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]
)
;

编辑: 这是另一个查询,它显示一旦使用查询作用域集(众所周知的解决方案)解决了子选择问题,表达式就可以正确地使用属性覆盖:

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]
)
;

感谢Boyan推特这个问题。 此致,Hrvoje

答案 1 :(得分:1)

我不是SSAS专家,但这与attribute overwrite有关。

您在订单功能评估中覆盖了您的子选择。请注意,此行为取决于上下文(轴eval,计算成员和数据透视)。在您的示例中,上下文是评估轴时的函数。行为与枢轴的评估不同(一旦知道了轴)。它很复杂但是它的方式。

请注意,在icCube中,在与某些MDX专家讨论后,我们决定简化并不遵循此行为:始终应用子选择过滤器。

答案 2 :(得分:1)

注意:请查看http://www.bp-msbi.com/2011/07/mdx-subselects-some-insight/,其中我更详细地解释了行为。

关于子选择的一篇很棒的文章是Mosha的2008 MDX: subselects and CREATE SUBCUBE in non-visual mode

注意使用subselect时会发生什么。应用隐式存在和可视总计。关于您遇到的问题,关键信息是:

2。如果没有坐标覆盖,即使在表达式内,也会将可视总计应用于物理度量值。

在您的第一个查询中,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,而不应用可视总计部分。查询结果与第二种情况相同,但您也会看到它所依据的实数。

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