我的问题是如何加入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不需要表之间的任何交互。如果我需要像这样加入,我该怎么办?
答案 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]