如何在MDX中进行聚合,类似于sql中的“sum over partition”语句

时间:2009-09-04 14:08:03

标签: mdx

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

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

select sum(volume) over (partition by productKey,year) as 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)如果我没有在计算成员中包含我不想要的行的所有成员总数不正确,是否有快捷方式强制它忽略您指定的所有其他维度?

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

1 个答案:

答案 0 :(得分:2)

嗯,首先,不要使用NonEmptyCrossJoin - 它是deprecated。使用non empty,然后使用cross join运算符(*)。

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

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