我感兴趣的是4个单独的维度:( A,B,C date)。每个维度都有多个属性层次结构。理论上,每个维度都相互映射。 C-> B->A。换句话说,B的多个成员映射到A中的单个成员,C的多个成员映射到B中的单个成员。
最初我有以下有效的查询
SELECT
(
[Measures].[Count]
)
ON COLUMNS,
(
[A].[Id].[Id].MEMBERS,
FILTER
(
[A].[Name].[Name].MEMBERS,
LEFT([A].[Name].CURRENTMEMBER.NAME, 4) <> "test"
),
[A].[Start].[Start].MEMBERS,
[A].[Owner].[Owner].MEMBERS
)
ON ROWS
FROM
(
SELECT
(
{[A].[Start].&[2020-05-10] : [A].[Start].&[2020-05-25]}
)
ON COLUMNS
FROM [Model]
)
WHERE
(
{[date].[date].&[2020-05-10] : [date].[date].&[2020-05-25]},
{[B].[End].&[2020-05-25]:NULL},
[A].[Product].&[ASDF]
)
我现在还有其他要求,只过滤B.id层次结构的“已启用”成员。因此,在WHERE
子句中,添加了以下行:[B].[Status].&[Enabled]
。这并没有改变我的输出,但是我知道应该这样,因为我必须在PowerBI中创建需要模拟的表,并且这种情况从A.id层次结构中消除了一些成员。
然后我尝试在行上添加[B].[id].[id].MEMBERS
和[B].[Status].[Status].MEMBERS
,以查看该关系是什么以及为什么不删除A.id的某些成员。我这样做如下:
(
[A].[Id].[Id].MEMBERS,
FILTER
(
[A].[Name].[Name].MEMBERS,
LEFT([A].[Name].CURRENTMEMBER.NAME, 4) <> "test"
),
[A].[Start].[Start].MEMBERS,
[A].[Owner].[Owner].MEMBERS,
[B].[id].[id].MEMBERS,
[B].[Status].[Status].MEMBERS
)
ON ROWS
但是这表明A的每个成员都与B的每个成员映射。基本上是交叉联接。这不是我所需要的。就像我提到的那样,B中有唯一的成员映射到A中的一个成员。我做了很多谷歌搜索,并遇到了LINKMEMBER()函数,但这似乎不适用于我需要的实现。任何帮助或建议,表示赞赏。
对于MDX来说还不是很新,所以我对此深表歉意。
欢迎使用Stackoverflow和MDX。您面临的问题是通过使用非空地址。在MDX中,如果您编写(DimA.Attribute1.members,DimB.Attribute1.members),则意味着您要进行交叉联接。为了确保仅返回有效的那些组合,您必须使用非空。在下面尝试修改过的查询
SELECT
(
[Measures].[Count]
)
ON COLUMNS,
non empty(
[A].[Id].[Id].MEMBERS,
FILTER
(
[A].[Name].[Name].MEMBERS,
LEFT([A].[Name].CURRENTMEMBER.NAME, 4) <> "test"
),
[A].[Start].[Start].MEMBERS,
[A].[Owner].[Owner].MEMBERS
)
ON ROWS
FROM
(
SELECT
(
{[A].[Start].&[2020-05-10] : [A].[Start].&[2020-05-25]}
)
ON COLUMNS
FROM [Model]
)
WHERE
(
{[date].[date].&[2020-05-10] : [date].[date].&[2020-05-25]},
{[B].[End].&[2020-05-25]:NULL},
[A].[Product].&[ASDF],[B].[Status].&[Enabled]
)