基于用户定义值的 MDX 计算列

MDX calculated column based on user defined value

我正在尝试生成一个 Excel 数据透视表Table,它根据用户指定的值(例如 InvoiceYear)显示和比较销售代表的收入数据。

此数据来自 SSAS 多维数据集,我已使用 PowerPivot 连接到它。我在数据模型中有来自多维数据集的列,我正在尝试编辑 Table 属性 window 中的 MDX 代码以创建一些新列。

这到目前为止有效,但 InvoiceYear 值目前被硬编码为“2010”。我需要一种方法让此代码接受用户在 excel 工作表本身的单元格中输入的值。

我只是这方面的初学者,所以我不知道这是否可行。

如果这种方法不可行,我真的需要找到另一种方法来做到这一点。每当单元格通过宏或 vba 更改时,从另一侧过来并刷新列?其他解决方案?

这是我在编辑 Table 属性 window 中的内容。这工作正常,但我不能像那样硬编码 Year 值,否则用户将无法指定自定义 Year 值,显然。我已经尝试了所有我能想到的引用 Sheet 中的单元格的方法,但该列通常显示为空,没有任何错误。

WITH MEMBER RentalSales AS
    CASE when [SalesRep_Dim].[InvoiceYear].currentmember.membervalue = '2010' then [Measures].[LineAmountMST] else 0 end

SELECT NON EMPTY { Measures.RentalSales, [Measures].[LineAmountMST] } ON COLUMNS,  
NON EMPTY { ([SalesRep_Dim].[InvoiceMonth].[InvoiceMonth].ALLMEMBERS * [SalesRep_Dim].[InvoiceYear].[InvoiceYear].ALLMEMBERS * [SalesRep_Dim].[SaleRep].[SaleRep].ALLMEMBERS * [SalesRep_Dim].[ItemGroup].[ItemGroup].ALLMEMBERS * [SalesRep_Dim].[Site].[Site].ALLMEMBERS * [SalesRep_Dim].[Source].[Source].ALLMEMBERS * [SalesRep_Dim].[Type].[Type].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS
FROM ( SELECT ( -{ [SalesRep_Dim].[InvoiceMonth].&[]&[0], [SalesRep_Dim].[InvoiceMonth].[All].UNKNOWNMEMBER } ) ON COLUMNS FROM [GMFSalesTransRepRevenue]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS

我认为您目前的方法不可能。但是,如果您切换到使用 Power Query 从 SSAS 获取数据并加载到 Power Pivot,这应该是可能的。

Power Query 可以按照用户输入的 Excel 工作簿中的 here. The you read a cell 所述查询 SSAS,并在 Power Query 中过滤来自 SSAS 的数据。

您应该研究一下切片器,它们在视觉上更吸引人,您可以使用它们通过一次选择来过滤多个枢轴 table。

设置报表筛选器并将切片器设置为相同的属性,您可以将单元格用于公式引用,将切片器用于用户输入。

这应该很简单,只需选择您的数据透视表 table,转到“插入”excel 选项卡,在“过滤器”下显示 "Slicer".

Select 您尝试过滤的属性,您的切片器已完成。

有一个创建 write-back 度量的选项。您可以将其值转换为发生在您的数据透视表 table 中的计算成员。但是,这不是最佳做法。我建议避免使用这种方法。

步骤:

  1. 创建视图(例如,一列 int)。
  2. 从此视图创建一个度量值组。
  3. 添加带有回写设置的分区,参见:http://bidn.com/blogs/DevinKnight/ssis/1768/ssas-creating-and-using-a-writeback-measure-group
  4. 创建计算度量,例如:

(StrToMember('[SalesRep_Dim].[InvoiceYear].&[' + Cstr([Measures].[WriteBackMeasure]) + ']'), [Measures].[LineAmountMST])

其中 [Measures].[WriteBackMeasure] 是您的回写度量,如果 [Measures].[WriteBackMeasure] = 2010 那么您将得到以下内容:

([SalesRep_Dim].[InvoiceYear].&[2010], [Measures].[LineAmountMST])

  1. 打开两个数据透视表 tables:一个仅包含 [Measures].[WriteBackMeasure],另一个是包含计算成员的报告。