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

时间:2011-03-13 03:18:33

标签: sql-server database ssas olap cube

我正在试图弄清楚如何创建一个计算度量,在我的事实表中只生成一个唯一事实的计数。我的事实表基本上从历史角度存储事件。但我需要采取措施来过滤掉冗余事件。
以销售为例(由于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中的子查询是否可能或事件高效?

3 个答案:

答案 0 :(得分:0)

在SSAS中,创建一个基于唯一交易ID(销售数量或订单号)的度量,然后在属性窗口中测量“DistinctCount”聚合函数。

现在它应该计算不同的订单号,在它找到的任何尺寸切片下。

答案 1 :(得分:0)

发布的查询可能会被重写为:

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

答案 2 :(得分:0)

一个简单的答案就是在事实视图/ dsv查询中有一个“销售计数”列,为“初始”事件提供1,为事件的所有次要修订提供零,如果是活动被取消。这种“日志记录”方法可以很好地处理增量事实表加载。

另一种方法,从长远来看可能更有用,就是拥有一个事件维度:然后你可以在事实表中公开一个计算的度量,该度量是该维度中成员的计数非空。但是对于销售而言,这基本上是一个退化维度(基于事实表的维度),并且可能会变得非常大。这可能不合适。

有时候要求可能会更复杂。如果按时间切片,您是否需要知道然后存在的所有不同事件,即使它们后来被取消了?这开始变得棘手:最近有一篇关于Chris Webb博客的帖子,他谈到了一个(略显毛茸茸)的解决方案:

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