2011-03-13 39 views
0

我想知道如何创建一个计算出的度量,该度量仅在事实表中生成唯一事实的计数。我的事实表基本上是从历史的角度存储事件。但我需要采取措施来滤除冗余事件。
以销售额为例(由于OLAP周围的所有材料总是使用销售额作为示例):

事实表存储销售活动。首次销售时,它有一个独特的销售参考,它是事实表中的一列。然而,一个独特的销售可以修改(项目添加或返回)或完全取消。事实表将这些更改存储为不同的行。


如果我使用SSAS创建计数度量,我会计算所有销售事件的数量,这意味着对于对其进行的每次更改(在某些报告中都希望这样做),独特销售将被多次计数。不过,我也想要一种能够产生独特销售数量而非事件数量的衡量标准,而不仅仅是基于统计独特的销售参考。如果用户按日期过滤,则他们应该看到在该日期仍然存在的唯一销售(如果销售在该日期被取消,则根本不应在计数中表示)。

只计算在某些单元格上聚合的度量

如何在MDX/SSAS中执行此操作?看起来好像我需要从查询中找到基于时间维度的销售的最新更改的子集中的计数查询工作。 在SQL它会是这样的:

SELECT COUNT(*) FROM SalesFacts FACT1 WHERE Event <> 'Cancelled' AND
Timestamp = (SELECT MAX(Timestamp) FROM SalesFact FACT2 WHERE FACT1.SalesRef=FACT2.SalesRef)

是否有可能或事件高性能有子查询的MDX?

+0

顺便说一句,这不是在SQL做计数的性能方法。 eventID的明确计数(特别是如果被索引的话)会好得多。或'Row_number over ...'类型的方法。上述情况将会导致数据量大增。 – piers7 2011-03-24 08:49:23

回答

0

在SSAS中,创建基于唯一事务标识(销售编号或订单编号)的度量,然后在属性窗口中将该度量设置为“DistinctCount”聚合函数。

现在它应该计算不同的订货号,在它发现自己的任何尺寸切片下。

0

张贴的查询可能可能会被改写这样的:

SELECT COUNT(DISTINCT SalesRef) 
FROM SalesFacts 
WHERE Event <> 'Cancelled' 
0

一个简单的答案是只是在你实际上视图/ DSV查询“销售数量”一栏,对于一个“初始供应1 '事件,对事件的所有子部分修订为零,如果事件被取消,则为-1。这种“日记”方法与增量事实表加载很好地结合在一起。

从长远来看,另一种可能更有用的方法是创建一个事件维度:然后,您可以公开一个计算出的度量值,该度量值是您事实上给定度量上非维度空间中该维度的成员数量表。然而,对于销售来说,这实质上是一个退化的维度(基于事实表的维度),可能会变得非常大。这可能不合适。

有时需求可能会更复杂。如果按时间划分,你是否需要知道存在的所有不同事件然后,即使它们后来被取消了?这开始变得棘手:有克里斯·韦伯的博客最近的文章中,他谈到了一个(微毛)解决方案:

http://cwebbbi.wordpress.com/2011/01/22/solving-the-events-in-progress-problem-in-mdx-part-2role-playing-measure-groups/

相关问题