如何在MDX中进行类似于';分区和#x27;sql中的语句

如何在MDX中进行类似于';分区和#x27;sql中的语句,mdx,Mdx,我有一种情况,我有一个产品和一个时间维度,有一个销售额的事实表。随着时间的推移,关于产品的各种细节都会发生变化,除了产品的业务密钥。在多维数据集中的平面报告中,我希望在“业务密钥”级别包含一些聚合,而不管显示产品维度的其他部分 在sql中,这很简单,例如: select sum(volume) over (partition by productKey,year) as Total 不管我选择了什么,Total列只会在这两个字段上聚合 在MDX中,我成功地实现了相同的结果,但似乎必须有一种更简

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

在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) 如果我不在计算成员中包含我不想要的行的allmembers,则总数不正确,是否有快捷方式强制它忽略除您指定的尺寸以外的所有尺寸


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

首先,不要使用
NonEmptyCrossJoin
——它已经过了。使用
非空
,然后使用
交叉连接
操作符(
*

理解元组和元组集如何工作以回答您的问题很重要。本质上,任何未明确说明的维度都将始终获得给定维度的
CurrentMember
。通常,这是
DefaultMember
,但如果在查询中将其设置为其他内容,则会将其更改。您必须为这些维度指定
ALLMEMBERS
,因为它将使用
CurrentMember
,否则。您可以只使用
[All]
成员,而不是试图对
所有成员进行汇总(尤其是如果它们不是扁平的!),这将为您提供更好的性能


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

您不需要SQL中的“分区依据”,是吗?一个简单的“分组依据”就可以了。当我有几个混合粒度的聚合时,我使用分区依据,否则分组就更简单了。我使用的是NonEmptyCrossJoin,因为当我引入太多维度时,reporting services会爆发太多元组错误。它似乎解决了这个问题。添加另一个度量值组的问题是,它不允许我使用已用于更细粒度聚合的事实表。我将尝试根据对事实表的查询添加另一个“表”,但这可能很棘手,因为我需要在业务键和年份上进行聚合,而不需要其他。