由FILTER产生的集合与从{}产生的集合在集合方面的差异

我正在build立/维护一个相当庞大的报告,目前依靠Excel中的Cube公式(是的,这太可怕了,是的,没有其他select)。

一个有点痛苦的地方是CubeSet ,它通常是通过指定每个成员的集合来长时间指定的,例如

 CUBESET( __CurrentSheet_Connection__, "{ [Geography].[CountryHierarchy].[Asia].[China], [Geography].[CountryHierarchy].[Asia].[Japan] }" ) 

当成员改变名字,或者更糟糕的是,在层级结构的时候(例如,如果我们消除了亚洲,直接走向国家),维护这个过程当然是相当困难的。

一种更直接的维护方法是尝试使用FILTER而不是一些文本parsing来获得一个集合。 不幸的是,这不起作用,因为当Excel将公式转换成查询时,它将组传递给AGGREGATE函数。

出于某种原因,而

 WITH MEMBER [D].[H].[XL_51] AS AGGREGATE({[D].[H].[M1], [D].[H].[M2]}) 

作品,

 WITH MEMBER [D].[H].[XL_51] AS AGGREGATE( FILTER( [D].[H].Children, INSTR("|M1||M2||M3|", "|" & [D].[H].CurrentMember.Name & "|", 0) ) ) 

当结果集合传递给CUBEVALUE公式时,

谁能告诉我,首先,为什么第二个不行,理想情况下,如果有办法让它(或类似的)工作。

编辑:意识到我与Excel转换成一个立方体集的语句有错误。 我有SET ,它使用MEMBER来设置(并将它们聚合在一起)。

编辑2:添加,我试图使用成员通过CUBEVALUE()公式获取值。

您可以在CubSet函数中包含任何有效的mdxexpression式并返回一个set 。 一些例子:

 {} .members .allmembers filter union intersect ... 

你可以在这里find所有的定义: https : //msdn.microsoft.com/en-us/library/ms145970.aspx

我很惊讶,这实际上是有效的:

WITH SET [XL_51] AS AGGREGATE({[D].[H].[M1], [D].[H].[M2]})

…理由是Aggregate通常用于创build计算成员而不是自定义集合。 所以我假设技术对你很友善,把它变成一个单一的成员。
这更多的是使用Aggregate ::

WITH MEMBER [D].[H].[XL_51] AS AGGREGATE({[D].[H].[M1], [D].[H].[M2]})

Filter是一个迭代的mdxfunction,所以应该保存在特殊的场合,即它可能慢!

所以你的第二个片段会更好,因为它也是一个计算的成员(假设你真的想把filter发现的成员聚合在一起:

 WITH MEMBER [D].[H].[XL_51] AS AGGREGATE( FILTER( [D].[H].Children, INSTR("|M1||M2||M3|", "|" & [D].[H].CurrentMember.Name & "|", 0) ) ) 

如果你真的想要一个自定义设置,那么不要打扰Aggregate

 WITH SET [XL_51] AS FILTER( [D].[H].Children, INSTR("|M1||M2||M3|", "|" & [D].[H].CurrentMember.Name & "|", 0) ) 

编辑

要对AdvWrks使用CUBESET函数,以下两个返回一组两个成员:

 =CUBESET("AdvWrksConnection", "{ [Geography].[Country].[Canada] ,[Geography].[Country].[Germany] }" ) 

…这是使用Filter的变种:

 =CUBESET("AdvWrksConnection", "Filter ( [Geography].[Country].Children , Instr([Geography].[Country].CurrentMember.Member_Caption ,'germ' ) OR Instr([Geography].[Country].CurrentMember.Member_Caption ,'ada' ) )" ) 

如果我然后使用包含此集合的xl单元作为CUBEVALUE函数的Member_expression参数,那么简单的{}表示法将返回一个值,而指向使用filter函数的单元格表示CUBEVALUE does not return a value. Neither cell contains a CUBEVALUE does not return a value. Neither cell contains a member_expression`,所以对于我来说,预期的行为对于这两种情况都是错误的。

我会避免这种隐式的聚合和从设置到成员的转换,xl似乎在做,通过明确计算自己的成员。 您可以使用这里find的菜单:

– >可转换的工具
– >分析
– > OLAP工具

然后创build一个自定义成员,它是自定义集合的集合。 您创build的这些新成员可以直接在CUBEVALUE函数中使用,例如

1创build集合:

在这里输入图像说明

2汇总指定的集合:

在这里输入图像说明

3在一个公式中使用它:

 =CUBEVALUE("AdvenWorksConnection","[Geography].[Country].[All Geographies].[aggregatedQuuq] ",L$5)