首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MicroStrategy -带连接的动态属性

MicroStrategy -带连接的动态属性
EN

Stack Overflow用户
提问于 2014-03-01 01:50:16
回答 2查看 3.4K关注 0票数 1

在我们的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代码确定:

代码语言:javascript
复制
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:将“三个日期”改为“两个日期”。

EN

回答 2

Stack Overflow用户

发布于 2014-03-02 04:59:11

如果我正确理解了您的问题,您已经创建了多个日期属性(具有不同的逻辑含义),并且它们映射到日历表的不同别名上。

除非用户在他们的报告中使用不同的单个事实表,否则没有问题,但是当他们使用来自销售和发票的度量/事实时,您会得到成倍的结果,因为“订单日期”和“发票日期”是不同的属性。

您的SQL如下所示:

代码语言:javascript
复制
...
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是这样的:

代码语言:javascript
复制
...
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:

代码语言:javascript
复制
...
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将再次以重复的结果结束:

代码语言:javascript
复制
...
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
...

因此,如果您希望将这两个属性分开,除了将它们映射到同一查找上之外,还应该:

  • 创建一个隐藏属性(我们称其为"Date_on_fact"),将其映射到事实表和日历表上,并使其成为"Order Date“和"Invoice Date”的子属性。
  • 从事实数据表中取消“订单日期”和“发票日期”的映射。

这里的想法是强制MicroStrategy始终使用SQL代码始终使用日历查找表:

代码语言:javascript
复制
...
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将使用它从父属性转到事实表。

希望这篇文章能帮助你从泥潭中走出来。

票数 0
EN

Stack Overflow用户

发布于 2014-04-10 00:03:54

我们也有同样的问题。我们必须为此创建一个通用时间层次结构,并将2个不同的发票和订单时间层次结构连接到通用时间层次结构。

它的效果就像是魅力!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22102308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档