Присоединение элементов из разных измерений к строкам в многомерных выражениях - PullRequest
0 голосов
/ 26 мая 2020

У меня есть 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].&[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)

Как видите, некоторые значения NULL должны все еще присутствовать, потому что им сопоставлены элементы B.Id "Enabled".

Затем я попытался добавить [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].&[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, поэтому приношу свои извинения за подробное объяснение.

1 Ответ

0 голосов
/ 27 мая 2020

Добро пожаловать в 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]
)
...