在我们的MicroStrategy 9.3环境中,我们有一个具有多个日期维度的星型架构。对于本例,假设我们有一个order_fact表有两个日期,order_date和ship_date,还有一个invoice_fact表有两个日期invoice_date和actual_ship_date。我们有一个具有“日历”相关数据的date维度。根据MicroStrategy高级数据仓库指南,我们为每个日期设置了一个别名,这是MicroStrategy推荐的处理角色扮演维度的方法。
现在是问题所在。别名日期允许用户创建特定于已使用别名的日期的报告。但是,由于日期已被别名,MicroStrategy不会组合“日期”,因为它们看起来是不同的。举个恰当的例子,我不能轻易地生成一个按order_date和invoice_date显示订单数量和发票数量的报告,因为这会导致交叉连接。
我们在内部讨论的解决方案是创建一个名为order_fact_date的新属性和一个invoice_fact_date。这些日期将在运行时通过下面的psuedo代码确定:
case when <user picked date> = 'order date'
then order_date
else ship_date end as order_fact_date
case when <user picked date> = 'invoice date'
then invoice_date
else actual_ship_date as invoice_fact_date我们的想法是,我们可以将“通用”日期维度映射到两个日期,这将使MicroStrategy能够在联接中利用相同的表,从而消除交叉联接问题。
干净得像泥一样?
编辑1:将“三个日期”改为“两个日期”。
发布于 2014-03-02 04:59:11
如果我正确理解了您的问题,您已经创建了多个日期属性(具有不同的逻辑含义),并且它们映射到日历表的不同别名上。
除非用户在他们的报告中使用不同的单个事实表,否则没有问题,但是当他们使用来自销售和发票的度量/事实时,您会得到成倍的结果,因为“订单日期”和“发票日期”是不同的属性。
您的SQL如下所示:
...
FROM order_fact a11
INNER JOIN invoice_fact a12
INNER JOIN lu_calendar a13
ON a11.order_date = a13.date_id
INNER JOIN lu_calendar a14
ON a12.invoice_date = a14.date_id
...像往常一样,有可能的解决方案,并不是所有的解决方案都非常简单。
选项1-单一日期属性
您在问题中提到了这种可能性,而不是使用“订单日期”和“发票日期”,只需使用单个“日期”属性并教用户使用它。您可以将其称为“报告日期”或“操作日期”,如果这会使他们的生活更轻松的话。
你应该得到的SQL是这样的:
...
FROM order_fact a11
INNER JOIN invoice_fact a12
ON a11.order_date = a12.invoice_date
INNER JOIN lu_calendar a13 -- Only one join
ON a11.order_date = a13.date_id -- because the date is the same
...选项2-我们需要保留两个日期属性!
将“订单日期”和“发票日期”映射到日历表的同一别名上。这通常会在MicroStrategy中导致问题,因为两个属性将在相同的查找表上连接在一起,请参阅后面的内容,但在您的情况下,这正是您要查找的。
使用此解决方案时,您应该会得到如下SQL:
...
FROM order_fact a11
INNER JOIN invoice_fact a12 -- Hey! this is again a cross join!
INNER JOIN lu_calendar a13
ON a11.order_date = a13.date_id -- Relax man, we got you covered.
AND a12.invoice_date = a13.date_id -- Yes, we do it!
...这很好,但只有当您有来自日程表的描述表单时才有效(日期并不总是这样,因为ID通常也是您在报告中显示的实际值)。如果您没有日历查找的联接,SQL将再次以重复的结果结束:
...
FROM order_fact a11 -- Notice no join column between the two facts
INNER JOIN invoice_fact a12 -- and no other conditions will help to join them
...因此,如果您希望将这两个属性分开,除了将它们映射到同一查找上之外,还应该:
这里的想法是强制MicroStrategy始终使用SQL代码始终使用日历查找表:
...
FROM order_fact a11
INNER JOIN invoice_fact a12 -- This is like the previous one
INNER JOIN lu_calendar a13 -- But I'm back to help you
ON a11.order_date = a13.date_id
AND a12.invoice_date = a13.date_id
...属性"Date_on_fact“实际上是可以隐藏的,用户不需要将其放入他们的报告中,但是MicroStrategy将使用它从父属性转到事实表。
希望这篇文章能帮助你从泥潭中走出来。
发布于 2014-04-10 00:03:54
我们也有同样的问题。我们必须为此创建一个通用时间层次结构,并将2个不同的发票和订单时间层次结构连接到通用时间层次结构。
它的效果就像是魅力!
https://stackoverflow.com/questions/22102308
复制相似问题