Topcount与所有成员的总数

时间:2015-05-05 14:48:36

标签: filter mdx mondrian

我正在创建一个查询,其中显示所有大洲,他们的国家和这些国家/地区的前5位用户(1维)及其订单(度量)。现在,我想向这些国家/地区的所有用户展示,而不是仅显示前5位用户。

我按照以下帖子中的答案https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e65c498c-ecf7-4099-a242-64873b8c3613/mdx-topcount-with-non-filtered-totals?forum=sqlanalysisservices 但是语法似乎不适合蒙德里安。

这是我的疑问:

WITH MEMBER [Measures].[Total] AS 
'SUM([USER].[Country].currentmember, (USER].[UserName].Members, [Measures].[Orders]))'
SELECT NON EMPTY {[Measures].[Orders], [Measures].[Total]} ON COLUMNS, 
NON EMPTY {Order(Hierarchize({[USER].[Continent].Members, Generate([USER].[Country].Members, TopCount(Hierarchize({[USER].[Country].currentmember, [USER].[UserName].Members}), 6.0, [Measures].[Orders]))}), [Measures].[Orders], DESC)} ON ROWS 
FROM [Products] 
WHERE [Time].[Time].[2014]

Mondrian为此部分提供以下错误'SUM([USER]。[Country] .currentmember,(USER)。[UserName] .Members,[Measures]。[Orders])) “:

Caused by: mondrian.olap.MondrianException: Mondrian Error:No function matches signature '(<Set>, <Member>)'
    at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:969)
    at mondrian.olap.ValidatorImpl.getDef(ValidatorImpl.java:205)
    at mondrian.olap.fun.FunUtil.resolveFunArgs(FunUtil.java:2023)
    at mondrian.mdx.UnresolvedFunCall.accept(UnresolvedFunCall.java:102)
    at mondrian.olap.ValidatorImpl.validate(ValidatorImpl.java:79)
    at mondrian.olap.fun.FunUtil.resolveFunArgs(FunUtil.java:2020)
    at mondrian.mdx.UnresolvedFunCall.accept(UnresolvedFunCall.java:102)
    at mondrian.olap.ValidatorImpl.validate(ValidatorImpl.java:79)
    at mondrian.olap.Formula.accept(Formula.java:106)
    at mondrian.olap.ValidatorImpl.validate(ValidatorImpl.java:155)
    at mondrian.olap.Query.resolve(Query.java:551)
    at mondrian.olap.Query.resolve(Query.java:446)
    at mondrian.olap.Query.<init>(Query.java:200)
    at mondrian.olap.Query.<init>(Query.java:161)
    at mondrian.olap.Parser$FactoryImpl.makeQuery(Parser.java:927)
    at mondrian.parser.MdxParserImpl.selectStatement(MdxParserImpl.java:1241)
    at mondrian.parser.MdxParserImpl.statement(MdxParserImpl.java:1074)
    at mondrian.parser.MdxParserImpl.statementEof(MdxParserImpl.java:188)
    at mondrian.parser.JavaccParserValidatorImpl.parseInternal(JavaccParserValidatorImpl.java:57)
    at mondrian.olap.ConnectionBase.parseStatement(ConnectionBase.java:96)
    ... 72 more

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是一个标准错误。

这是无效的:

Sum
(
  [USER].[Country].CurrentMember
 ,(
    USER.[UserName].MEMBERS
   ,[Measures].[Orders]
  )
)

更具体地说,这个位无效

 ,(
    USER.[UserName].MEMBERS
   ,[Measures].[Orders]
  )

大括号()创建一个tuple,并创建一个元组:

  (<member_expression>, <member_expression>, <member_expression>, ...)

不允许任何参数设置表达式。

我假设你想要所有UserNames的Total - 所以只需在元组中使用该层次结构的All成员:

Sum
(
  [USER].[Country].CurrentMember
 ,(
    USER.[UserName].[All User Names] //<<<<replace this with whatever the correct name is of your all member
   ,[Measures].[Orders]
  )
)

答案 1 :(得分:1)

之前的回答恰如其分地涵盖了“元组问题”,所以不会深入研究这个问题。这是解决问题的另一种方法。

SUM
(
  [USER].[Country].CurrentMember
 ,
 AGGREGATE
    (
       USER.[UserName].MEMBERS
      ,[Measures].[Orders]
     )
)

AGGREGATE函数将完成添加范围内所有用户名的订单的工作。