【问题标题】:MDX calculated column based on user defined value基于用户定义值的 MDX 计算列
【发布时间】:2017-01-12 00:05:44
【问题描述】:

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

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

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

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

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

这是我在“编辑表属性”窗口中的内容。这可以正常工作,但我不能像那样硬编码年份值,否则用户显然无法指定自定义年份值。我已经尝试了所有我能想到的方法来引用工作表中的单元格,但该列通常只是空的,没有错误。

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

【问题讨论】:

    标签: ssas mdx excel-2013 cube


    【解决方案1】:

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

    Power Query 可以按照here 的描述查询 SSAS。 You read a cell 在用户输入的 Excel 工作簿中,并在 Power Query 中筛选来自 SSAS 的数据。

    【讨论】:

    • 谢谢,我最初尝试过电源查询,但性能很糟糕。也许我需要再看看。
    【解决方案2】:

    您应该研究切片器,它们在视觉上更具吸引力,您可以使用它们通过一次选择过滤多个数据透视表。

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

    这应该像选择您的数据透视表一样简单,转到“插入 excel”选项卡,在“过滤器”下显示“切片器”。

    选择您要过滤的属性,您的切片器就完成了。

    【讨论】:

    • 这种方法是否允许我使用 CASE WHEN 或类似方法创建列,如上面的 MDX 代码所示?
    • 只需在 Excel 中使用 If 即可
    【解决方案3】:

    可以选择创建回写措施。您可以将其值转换为发生在您的数据透视表中的计算成员。但是,这不是最佳做法。我建议避免使用这种方法。

    步骤:

    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. 打开两个数据透视表:一个带有 [Measures]。仅 [WriteBackMeasure],另一个是您的带有计算成员的报表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多