由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
函数中包含任何有效的mdx
expression式并返回一个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)