【问题标题】:Calculated Measure aggregating on certain cells only仅在某些单元格上聚合的计算度量
【发布时间】:2011-03-13 03:18:32
【问题描述】:

我试图弄清楚如何创建一个计算度量,该度量仅在我的事实表中产生唯一事实的计数。我的事实表基本上从历史的角度存储事件。但是我需要该措施来过滤掉多余的事件。
以销售为例(因为围绕 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 中是否有可能或事件性能良好?

【问题讨论】:

  • 顺便说一句,这不是在 SQL 中进行计数的高效方法。 eventID 的不同计数(特别是如果它被索引)会好得多。或“Row_number over ...”类型的方法。以上将随着大量数据而消失。

标签: sql-server database ssas olap cube


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多