我有一种情况,我有一个产品和一个时间维度,有一个销售量的事实表。随着时间的推移,除产品的业务密钥外,有关产品的各种详细信息也会发生变化。在我来自多维数据集的平面报告中,我希望在“业务键”级别包含一些聚合,而不管产品维度的其他部分是什么。
在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)如果我没有在计算成员中包含我不想要的行的所有成员总数不正确,是否有快捷方式强制它忽略您指定的所有其他维度?
我要问的部分原因是我需要添加一堆其他计算成员,其中一些将使用参数,如果我使用上面示例中的方法,我将需要复制相同的东西多个地方,代码会变得很重。
答案 0 :(得分:2)
嗯,首先,不要使用NonEmptyCrossJoin
- 它是deprecated。使用non empty
,然后使用cross join
运算符(*
)。
了解元组和元组集如何回答您的问题非常重要。基本上,未明确声明的任何维度总是获得给定维度的CurrentMember
。通常,这是DefaultMember
,但如果您在查询中将其设置为其他内容,则会更改此设置。您必须为这些维度指定ALLMEMBERS
的原因是因为它将使用CurrentMember
,否则。您可以使用[All]
成员代替尝试总结ALLMEMBERS
(特别是如果它们不平坦!),这会给您带来更好的性能。
执行此操作的最佳方法是向多维数据集添加另一个度量值组,然后从该度量值组中删除不适用于度量值的键。这样,您可以获得这些的本机计算而不是运行时计算(这通常很慢,尤其是当您在多维数据集中添加所有内容时)。此外,您甚至可以在该度量组上设置一些聚合设计,并且性能非常高。