我在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等函数似乎具有相同的行为。
干杯。
答案 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度量上显示所选的可视总计。