1

我有一种情况,我有一个产品和一个时间维度,以及一个销售量事实表。随着时间的推移,产品的各种细节都会发生变化,但产品的业务密钥除外。在来自多维数据集的平面报告中,我想在“业务关键”级别包含一些聚合,而不管产品维度的其他部分是否显示。

在 sql 中,这将是微不足道的,例如:

select sum(volume) over (partition by productKey,year) as Total

无论我选择了什么其他内容,Total 列都只会在这两个字段上聚合。

在 MDX 中,我设法达到了相同的结果,但似乎必须有一种更简单的方法。

WITH MEMBER Measures.ProductKeyTotal AS
  'SUM(([Product].[ProductKey],[Time].[Year]
       ,[Product].[Product Name].[Product Name].ALLMEMBERS
       ,[Volume Type].[Volume Type Id].[Volume Type Id].ALLMEMBERS)
       ,[Measures].[Volume])'
SELECT {[Measures].[Volume],[Measures].[ProductKeyTotal]} ON COLUMNS,
    NONEMPTYCROSSJOIN ([Product].[ProductKey].[ProductKey].ALLMEMBERS
      ,[Time].[Time].[Year].ALLMEMBERS
      ,[Product].[Product Name].[Product Name].ALLMEMBERS
      ,[Volume Type].[Volume Type Id].[Volume Type Id].ALLMEMBERS) ON ROWS
FROM [My Cube]
WHERE ([Product].[Include In Report].&[True])

1)如果我没有在计算的成员中包含我不想要的行的所有成员,那么总数不正确,是否有一种快捷方式可以强制它忽略除您指定的所有维度之外的所有维度?

我问的部分原因是我需要添加一堆其他计算成员,其中一些将使用参数,如果我使用上面示例中的方法,我将需要在多个地方复制相同的东西,并且代码会变得很重。

4

1 回答 1

2

好吧,首先,不要使用NonEmptyCrossJoin--it's been deprecated。使用non empty然后cross join运算符 ( *)。

了解元组和元组集如何回答您的问题很重要。本质上,任何未明确说明的维度总是会得到CurrentMember给定维度的。通常,这是DefaultMember,但如果您在查询中将其设置为其他内容,则会更改此设置。您必须ALLMEMBERS为这些尺寸指定的原因是因为它将使用CurrentMember,否则。您可以只使用[All]成员来代替尝试总结ALLMEMBERS(特别是如果它们不是平坦的!),这会给您带来更好的性能。

执行此操作的最高效方法是将另一个度量组添加到您的多维数据集,然后从该度量组中删除不适用于该度量的键。这样,您可以获得这些的本地计算,而不是运行时计算(这往往很慢,尤其是当您将多维数据集中的所有内容相加时)。此外,您甚至可以在该度量组上设置一些聚合设计,它会非常高效。

于 2009-09-06T00:45:29.793 回答