Filter MDX:对同一维度的不同成员进行筛选和切片

Filter MDX:对同一维度的不同成员进行筛选和切片,filter,mdx,slice,iccube,Filter,Mdx,Slice,Iccube,我正在使用icCube的Sales cube学习MDX。我想写一个MDX查询来显示那些2010年销售收入超过80000美元的国家2009年的销售收入。我尝试了以下操作,但它返回了一个只有一列([Amount])的空表: 只用 WITH SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000) select [myset] on 0, [Amount] on 1 from [sales] wh

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

只用

WITH
 SET [myset] AS Filter([Country].members, ([Measures].[Amount], [2010])>80000)
select [myset] on 0, [Amount] on 1
from [sales]
where [2009]
在MDX中,这种类型的查询不需要subselect或
WHERE
。甚至可以省略set
myset
,编写

select Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0,
       [Amount] on 1
from [sales]
where [2009]
我在Adventure works上尝试了类似的查询,结果显示所有客户,澳大利亚、加拿大和美国,但法国、德国和英国除外:

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]

更新:元组评估是我们错过的一个案例,错误已经修复。请注意,在where子句和轴上使用相同的层次结构是很棘手的。任何集合都将被过滤掉:“{[2010],[2011]}在0..上,[2010]将返回[2010],但元组将在不过滤的情况下求值。相同维度的不同层次结构将应用autoexists筛选器

由于这有点棘手,我们决定扩展以允许在使用全局上下文计算的查询中声明一个集合,而不考虑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中的一个缺陷,我们将尽快修复()。同时,您必须避免在切片器和切片器中使用的筛选函数中使用相同的层次结构,例如:

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的版本):

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


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

这不起作用。它返回一个空表。我知道,在[2009]上进行切片将删除[2010]的所有数据…@MeirGoldenberg我用MS Adventure Works验证了我的查询(根据需要进行了修改),请参阅我编辑的答案。我假设您的查询或数据存在其他问题。icCube中存在错误:-(,这就是为什么不起作用请指出我出错的地方,但在我看来,没有子查询的解决方案显然是错误的,因为查询的求值顺序是:FROM、where、SELECT(set等)。where子句中的切片完成后(因此只有[2009]的数据保留在多维数据集中),我不能在SELECT子句中的[2010]上使用筛选器。请参阅本文:MDX中的WHERE子句不像SQL WHERE,更像是一种设置默认值的方式。因此,如果在轴中放置[2010],您将使用[2010]覆盖[2009]。当您使用子查询时,您会得到类似SQL WHERE子句中的行为。这很奇怪,但MDX是如何工作的直到我们在几天后发布一个新版本,您必须使用静态集或带有subselect的查询(我的第二篇文章)
WITH 
 MEMBER [Amount 2009] AS ([Amount],[2009])
SELECT 
  Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0,
  [Amount 2009] on 1
FROM [sales]
SELECT [Country].members on 0, [Amount] on 1
FROM (select  Filter([Country].members, ([Measures].[Amount], [2010])>80000) on 0 from [sales])
WHERE [2009]