更新:元组评估是我们错过的一个案例,该错误已在icCube 4.2中修复。请注意,在 where 子句和轴上使用相同的层次结构很棘手。任何集合都被过滤掉:“{[2010],[2011]} on 0 .. 其中 [2010] 将返回 [2010] 但未过滤就评估元组。相同维度的不同层次结构将应用自动存在过滤器。
由于这有点棘手,我们决定扩展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)。同时,您必须避免在切片器和切片器中使用的过滤器函数中使用相同的层次结构,例如:
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:类别
它们允许创建一个层次结构作为其他层次结构的成员。您可以将这些国家/地区定义为 [80000+],然后根据此新分类执行计算。