MDX:对同一维度的不同成员进行过滤和切片

时间:2013-12-16 12:23:19

标签: filter mdx slice iccube

我正在使用icCube的Sales多维数据集来学习MDX。我想写一个MDX查询,以显示2009年销售收入超过80,000美元的国家的销售收入。我尝试了以下操作,但它返回了一个只有一列([Amount])的空表:

WITH
 SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000)
select [Country].members on 0, [Amount] on 1
from (select [myset] on 0, [Amount] on 1 from [sales])
where [2009]

2 个答案:

答案 0 :(得分:2)

只需使用

WITH
 SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000)
select [myset] on 0, [Amount] on 1
from [sales]
where [2009]

在MDX中,此类查询不需要子选择或WHERE。你甚至可以省略集合myset,写作

select Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0,
       [Amount] on 1
from [sales]
where [2009]

我在Adventure作品上尝试了类似的查询,它显示了所有客户,澳大利亚,加拿大和美国,但没有显示法国,德国和英国:

SELECT Filter([Customer].[Country].Members,
              ([Measures].[Internet Sales Amount], [Date].[Calendar Year].&[2006]) > 600000
             )
       ON 0,
       {[Measures].[Internet Sales Amount]}
       ON 1
FROM [Adventure Works]
WHERE [Date].[Calendar Year].&[2008]

答案 1 :(得分:1)

更新:元组评估是我们错过的一个案例,该错误已在icCube 4.2中修复。注意在where子句和轴上使用相同的层次结构是很棘手的。任何集都被过滤掉:“{[2010],[2011]}在0 ..其中[2010]将返回[2010],但是在没有过滤的情况下评估元组。相同维度的不同层次结构将应用自动存在过滤器。< / p>

由于这有点棘手,我们决定扩展SETS以允许在使用全局上下文计算的查询中声明一个集合 - 而不考虑where子句和子查询:

WITH
-- always the same regardless of the where clause and subquery
  STATIC SET [Global] Filter([Country].members, ([Measures].[Amount], [2010])>80000)
..

简单而有效的解决方案就是按照Frank的建议,直接在轴上添加过滤后的国家/地区。

SELECT 
   // this will return the countries with sales amount bigger than 80'000 for [2010]
   // e.g. { [USA], [UK] } ... [2010] is is just used for filterting
   Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0,
   // When evaluated we're going to use [2009] as it's the slicer default value
   [Amount] on 1
FROM [sales]
WHERE [2009]

关于你的查询它应该有用,我同意,这是icCube中的一个错误,我们将尽快修复(PTS)。与此同时,您必须避免在切片器和切片器中使用的Filter函数中使用相同的层次结构,例如:

WITH 
 MEMBER [Amount 2009] AS ([Amount],[2009])
SELECT 
  Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0,
  [Amount 2009] on 1
FROM [sales]

或者您可以更改为在icCube中运行的版本(效率低于Frank的效率):

SELECT [Country].members on 0, [Amount] on 1
FROM (select  Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0 from [sales])
WHERE [2009]

如果您正在玩基于不同评论的分组,您可以使用几个月前推出的icCube新功能:Categories

它们允许创建层次结构作为其他层次结构的成员。您可以将这些国家定义为[80000+],然后根据此新的分类进行计算。