如何编写一个计算事实发生的mdx表达式

时间:2013-07-03 19:56:43

标签: mdx mondrian

假设我有一个称为图书馆书籍的维度和称为过期日期的事实。如何编写一个mdx表达式,该表达式将返回每个num天过期值存在的书籍数量?换句话说:

Days Overdue | Num books
1            | 3498
2            | 237
3            | 57

在SQL中,答案很简单:

select days_late,count(*) from days_overdue_fact group by days_late

在mdx中,我试过这个:

with member [Measures].[Overdue Count] as 'count([Book].[System Id].members) '
select  [Measures].[Overdue Count] on 0,
[Measures].[Days Late] on 1
FROM [myCube] 

但我收到蒙德里安的投诉: '[Measures]'出现在多个独立的轴上。

我只想按事实价值进行分组。

2 个答案:

答案 0 :(得分:2)

解决方案是认识到这个过期措施只是累积快照事实的一部分(参见数据仓库工具包,第2版,Ralph Kimball或http://www.kimballgroup.com/2008/11/05/fact-tables/),它可以跟踪一本书的状态。当它通过其结账/进行中。

在多维数据集中拥有这样的累积快照事实并没有错。您只需要了解它是什么以及如何查询它。在这种情况下,我想计算出这个事实中出现的每个值的出现次数,最简单的方法是使用sql group而不是mdx。

答案是原始问题中的sql。没有mdx解决方案可以通过我所知道的度量值进行分组。 MDX是此查询的错误工具。

答案 1 :(得分:1)

在我看来,构建多维数据集的方式是错误的。 [Days Overdue]不需要(甚至可能最好不要)作为衡量标准。最常测量的是相关数值shall be calculated for each possible combination of dimension values。绝对是可以取值 null ,但非常罕见。我真的没有看到你如何将[Days Overdue]与所有维度值的可能组合联系起来。
您在此处作为衡量标准可以轻松地成为计算维度字段,您可以在其中从NOW()中扣除借用日期。在这种情况下,只有一个问题需要回答,那就是知道借阅日期(借书的日期)是否属于事实表。如果这是真的那么你必须定义一个新的事实维度并在那里定义你的关系here