MDX加入外键

时间:2015-05-25 08:08:11

标签: join ssas mdx olap

我的问题是如何加入table1.id = table2.foreign_key中的MDX

我有两个方面:样本,患者。和样本连接样本事实表和患者事实表连接的患者。  现在我需要得到表,它的列是这两个表中的字段。

SELECT 
  {} ON 0
 ,CrossJoin
  (
    Union
    (
      Union
      (
        [Sample.patient result info].[data collection].MEMBERS
       ,[Sample.patient result info].[result].MEMBERS
      )
     ,[Sample.patient result info].[code lab].MEMBERS
    )
   ,[Patient.patient sample info].[NID].MEMBERS
  ) ON 1
FROM [EIDCube].

所以CrossJoin不需要表之间的任何交互。如果我需要像这样加入,我该怎么办?

2 个答案:

答案 0 :(得分:0)

就语法而言,您在脚本的最后有一个. - 这是无效的mdx。完成脚本的标准方法是使用分号;

您可以简单地使用一个集合来简化嵌套的UNION,使用符号{...}并使用其中的所有成员。

使用*运算符表示现代交叉连接。

考虑到上述情况,我们现在有了这个:

SELECT 
  {} ON 0
 ,
    {
      //<<creates the set
      [Sample.patient result info].[data collection].MEMBERS
     ,[Sample.patient result info].[result].MEMBERS
     ,[Sample.patient result info].[code lab].MEMBERS
    }
  * 
    //<<CrossJoin
    [Patient.patient sample info].[NID].MEMBERS ON 1
FROM [EIDCube];
//<<finish with a semi-colon 

你提到了一个事实表 - 这似乎意味着你想要从表中查看一个度量。那么为什么不在轴0上包含度量:

SELECT 
  {[Measures].[SomeMeasureFromFact]} ON 0 //<<replace with actual measure
 ,
    {
      [Sample.patient result info].[data collection].MEMBERS
     ,[Sample.patient result info].[result].MEMBERS
     ,[Sample.patient result info].[code lab].MEMBERS
    }
  * 
    [Patient.patient sample info].[NID].MEMBERS ON 1
FROM [EIDCube];

现在上面可能会发生的事情是你返回的行很多是空的,所以将NON EMPTY关键词应用到轴上:

SELECT 
  NON EMPTY 
    {[Measures].[SomeMeasureFromFact]} ON 0
 ,NON EMPTY 
      {
        [Sample.patient result info].[data collection].MEMBERS
       ,[Sample.patient result info].[result].MEMBERS
       ,[Sample.patient result info].[code lab].MEMBERS
      }
    * 
      [Patient.patient sample info].[NID].MEMBERS ON 1
FROM [EIDCube];

如果您真的不想要任何衡量标准ON 0,那么您可以使用NONEMPTY函数(https://msdn.microsoft.com/en-us/library/ms145988.aspx),如下所示:

SELECT 
 {} ON 0
 ,
   NONEMPTY(
      {            
        [Sample.patient result info].[data collection].MEMBERS
       ,[Sample.patient result info].[result].MEMBERS
       ,[Sample.patient result info].[code lab].MEMBERS
      }
    * 
      [Patient.patient sample info].[NID].MEMBERS
   ,[Measures].[SomeMeasureFromFact]
   )
 ON 1
FROM [EIDCube];

答案 1 :(得分:0)

  

LinkMember - 返回与a中指定成员等效的成员   指定的层次结构。

     

语法 - LinkMember(Member_Expression,Hierarchy_Expression)

Courtest msdn

这最接近MDX中的SQL JOIN

假设您希望Patient维度中的成员具有与下面相同的键值 -

[Samples].[PatientID].&[1001]

您需要使用类似

的内容
LinkMember ([Samples].[PatientID].&[1001], [Patient].[PatientID])

[Patient].[PatientID]层次结构中获得成员后,您可以继续玩游戏以获取度量值。

请注意,此功能一次只能使用一个成员。你无法将集合传递给它。

希望它有所帮助。

编辑@whytheq

SELECT   LinkMember ([Date].[Date].[July 1, 2002], [Date].[Calendar]) ON 0,
[Measures].[Reseller Sales Amount] ON 1
FROM [Adventure Works]

上述脚本会为[Date].[Calendar]层次结构中的成员提取经销商销售额,该成员具有与[Date].[Date].[July 1, 2002]相同的键值。

几乎在SQL JOIN的行上,我们可以加入这个键。

有许多限制,但对我而言,它解决了目的。

例如,事实表F1中存在度量[Measures].[M]的情况。还有另一个层次结构D1.H1。让我们说要求是获取成员D1.H1的度量值。&amp; [SomeValue],但是,D1和F1之间没有映射,但是Attributes at each level have the same key cardinality and data type

然后我们可以利用此功能并使用如下 -

SELECT LinkMember(D1.H1.&[SomeValue], F1.H2) ON 1,
[Measures].m on 0
FROM [SomeCube]