【问题标题】:Join members from different dimensions on rows in MDX在 MDX 中的行上连接来自不同维度的成员
【发布时间】:2020-05-26 20:50:24
【问题描述】:

我有 4 个我感兴趣的独立维度:(A、B、C 日期)。 每个维度都有多个属性层次结构。 每个维度理论上都相互映射。 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]
)

我得到的输出如下:

  A.id  |  A.Name  |  A.Owner  |  Count 
----------------------------------------
   1    |     A    |    asdf   | (null)
   2    |     B    |    asdf   |   23
   3    |     C    |    asdd   | (null)
   4    |     D    |    asdf   | (null)
   5    |     E    |    qwer   |  5067
   6    |     F    |    adfd   | (null)
   7    |     G    |    wert   | (null)
  ...   |    ...   |    ....   |   ...
  25    |     Y    |    werd   | (null)

如您所见,数据中有很多空值。

我现在有额外的要求,只过滤 B.id 层次结构的“已启用”成员。 所以在WHERE 子句中我添加了以下行:[B].[Status].&amp;[Enabled]。 这并没有改变我的输出,但我知道它应该改变,因为我必须在 PowerBI 中列出我需要模拟的表格,并且这种情况会从 A.id 层次结构中消除一些成员。

新输出应如下所示:

  A.id  |  A.Name  |  A.Owner  |  Count 
----------------------------------------
   2    |     B    |    asdf   |   23
   4    |     D    |    asdf   | (null)
   5    |     E    |    qwer   |  5067
   7    |     G    |    wert   | (null)
  ...   |    ...   |    ....   |   ...
  25    |     Y    |    werd   | (null)

如您所见,一些空值应该仍然存在,因为它们具有映射到它们的“已启用”B.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() 函数,但这似乎不适用于我需要的实现。感谢您提供任何帮助或建议。

我正在运行的当前查询如下。我尝试将注释的[B].[Status].&amp;[Enabled] 添加到WHERE 子句和ON ROWS 但它给了我与往常一样的结果。我还尝试使用FILTER 函数并仅过滤到[B].[Status].CURRENTMEMBER.NAME = "Enabled",但这会产生一个没有输出的空表。

SELECT 
(
    [Measures].[Count]
)
ON COLUMNS,
ORDER( 
    (
    --[B].[Status].&[Enabled],
    [A].[Id].Children,
    FILTER
    (
        [A].[Name].Children, 
        LEFT([A].[Name].CURRENTMEMBER.NAME, 4) <> "test"
    ),
    [A].[Start].Children,
    [A].[Owner].Children
    ),
    [A].[Start].CurrentMember.Member_Key,
    BASC
    )
ON ROWS
FROM 
(
    SELECT 
    (
        {[A].[Start].&[2020-05-21] : [A].[Start].&[2020-05-27]}
    )
    ON COLUMNS 
    FROM [Model]
)
WHERE
(
    {[date].[date].&[2020-05-21] : [date].[date].&[2020-05-27]},
    --[B].[Status].&[Enabled],
    [A].[Product].&[ASDF]
)

我对 MDX 还很陌生,所以我很抱歉进行了广泛的解释。

【问题讨论】:

    标签: ssas mdx cube


    【解决方案1】:

    欢迎使用 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]
    )
    

    需要记住的一件事是,当您使用不同维度的属性时,如果您有相同的维度,它会自动处理。示例(Dim1.attribute1.members,Dim1.attribute2.members),这只会返回存在的数据点。

    试试下面的查询。

    SELECT 
    (
        [Measures].[Count]
    )
    ON COLUMNS,
    ([B].[Status].&[Enabled],
        [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] 的空元素。所有其他 null 元素都需要保留,因为我通过将数据拉入 pandas 数据框来进一步了解。
    • 我已经进行了更改尝试。如果您附上您获得的输出与您想要获得的输出,它也有助于回答问题的人。
    • 我已经用所需的输出更新了帖子。希望对您有所帮助。
    • 关于在行上添加 [B].[Status].&[Enabled],它与将其添加到 WHERE 子句中的作用相同。所以输出仍然没有受到必要的影响:(
    • 分享您使用的确切查询?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多