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 中是否有可能或事件性能良好?

4

3 回答 3

0

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

现在它应该计算不同的订单号,在它发现自己的任何维度切片下。

于 2011-03-17T10:08:41.940 回答
0

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

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

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

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

于 2011-03-24T08:46:07.687 回答
0

发布的查询可能会像这样重写:

SELECT COUNT(DISTINCT SalesRef)
FROM SalesFacts
WHERE Event <> 'Cancelled'
于 2011-03-17T13:03:58.917 回答