在MDX中使用多个维度属性创建计算成员

时间:2014-12-18 14:25:55

标签: sql-server-2012 ssas mdx

首先,我对MDX的了解非常基础。由于底层数据量的增加,我们目前正在尝试将Tabular SSAS多维数据集迁移到多维多维数据集。作为其中的一部分,我们将表格模型中的所有计算字段转换为MDX计算度量。我们有两种类型的计算字段:

  • 根据其他维度属性计算度量。例如以特定货币销售(以美元*英镑汇率计算)。第一个问题我们面对计算测量,如果浏览多维数据集时这些值显示,除非选择相关字段(例如GBP Rate)。目前的解决方法是使用Scope函数对Fact表中的唯一ID进行计算。 E.g。

    创建会员[措施]。[以英镑计算销售]为0; 范围([Fact Table] .ID。[All]); [措施]。[以英镑计算销售额] = [措施]。[以美元计算销售额] * [FxRate]。[GBPRate]; 结束范围;

这是处理此问题的正确方法吗?对此提出任何建议都会非常有帮助。

  • 根据维度数据中的各种“文本”属性计算字段。下面列出了一些例子: 如果Fact.Artist为NULL / Blank,则使用DimArtist.Name的值填充“Artist”字段。 我们目前正在创建一个计算的度量(这不是理想的)来创建这个字段。我不确定如何正确使用示波器功能来获得所需的输出。

    如果Fact.Source ='XYZ',ProductID = XYZDimProduct.ProductID,if Fact.Source ='ABC',ProductID = ABCDimProduct.ProductID else ProductID = DimProduct.ProductID。

打算复制DAX计算列,这是以最低粒度级别计算的。

PS:由于IP问题,我没有发布实际查询。如果我需要用更好的例子来解释它,请告诉我。

先谢谢, Venki

1 个答案:

答案 0 :(得分:0)

Venki,

对于你的货币问题,我建议你有两个事实。第一个事实将与您现有的事实表非常相似(具有货币和时间以及它已有的所有其他内容)。第二个事实表专门用于货币,并且将保持汇率,在简单的情况下,从任何货币转换为GBP,它只有货币,时间和汇率。

如果ExchangeRate事实表的粒度与SalesFact表的粒度匹配,则计算简化为GBPAmount = SalesMeasureFromFact1 * RateMeasureInFact2。

换个问题。 。 。

“如果Fact.Source ='XYZ',ProductID = XYZDimProduct.ProductID,如果Fact.Source ='ABC',则ProductID = ABCDimProduct.ProductID else ProductID = DimProduct.ProductID。”

我会将语句作为计算列或通过ETL放入Fact表中。您会发现这比现有方法更好,更易于维护。 MDX在飞行中,但不一定是“在内存中”。因此,您可以通过预先计算负载,然后让MDX完成它的功能,进行聚合,从而获得最佳用户体验的性能。请记住,MDX非常强大,但仅仅因为它可以完成这项工作,它可能不是一直使用的最佳工具。