MDX:具有过滤成员的前 10 个

MDX: Top 10 with filtered members

我正在 iReport 中为 JasperServer 创建报告。我正在为 selected 产品下载次数最多的前 10 家公司创建一份报告。用户可以在 JasperReports select 中列出哪些产品(参数 {$P{ProductFormat}})。

我的产品维度具有以下结构:[Product].[ProductFactory].[ProductType],因此参数的输入例如可以是:[Product].[ProductCategory1].[Product1], [Product ].[ProductCategory2].[Product2], ...我还希望这些产品以行的形式提供,这样我就可以将它们用作 iReport 中的字段。 (其中的产品不是一个选项)

SELECT
  NON EMPTY {
    [Measures].[Orders]
  } ON COLUMNS,
  NON EMPTY
     Crossjoin({TopCount({[USER_COMPANY].[Company].Members}, 10, [Measures].[Orders])}, {$P{ProductFormat}})
   ON ROWS
FROM [Products]
WHERE $P{DateFilter}

此查询 return 所有产品的前 10 家公司,数据按产品过滤。我想要 selected 产品的前 10 家公司,但我无法让它与 topcount 一起工作。

这个通过 SSMS 针对 AdvWrks 的查询似乎工作正常:

WITH 
  SET [ProductFormat] AS 
    {
      [Product].[Product Categories].[Category].[Bikes]
     ,[Product].[Product Categories].[Category].[Clothing]
     ,[Product].[Product Categories].[Category].[Components]
    } 
SELECT 
  [Measures].[Reseller Sales Amount] ON 0
 ,Generate
  (
    [ProductFormat]
   ,
      [Product].[Product Categories].CurrentMember
    * 
      TopCount
      (
        [Geography].[Geography].[City].MEMBERS
       ,5
       ,[Measures].[Reseller Sales Amount]
      )
  ) ON 1
FROM [Adventure Works];

它returns如下:

如果我像下面这样添加一个 WHERE 子句,那么它似乎是上下文感知的:

WHERE [Date].[Calendar].[Calendar Year].&[2006];