MDX - получение уровня членов, используемых в настоящее время в предложении where

У меня есть простой куб данных с определенной иерархией организационной структуры. В моих вычислениях внутри куба я хотел бы иметь различные вычисления в зависимости от того, какой уровень организационных элементов в настоящее время используется в предложении WHERE в запросе MDX.

Допустим, у меня есть 5 уровней организационной структуры, и для последнего уровня (уровня магазина) я хотел бы изменить способ расчета с использованием выражения, например:

IIF([Organization Structure].[Parent Id].LEVEL IS [Organization Structure].[Parent Id].[Level 05], 'THIS IS STORE', 'THIS IS NOT')

выражение из куба данных

Это в браузере Visual Studio приводит к тому, что мы действительно хотим:результаты из браузера

и то же самое для использования MDX Query, как:

SELECT { [Measures].[TEST] } ON COLUMNS
FROM [DataCubeName]
WHERE
{
[Organization Structure].[Parent Id].&[123]
}

Проблема начинается, когда мы хотим использовать более одного элемента организационной структуры в предложении WHERE. В этом пункте разрешено иметь элементы только с одного и того же уровня, и я все еще хотел бы знать, какой это уровень, но, конечно, когда мы добавляем второй элемент в WHERE, вот так:

SELECT { [Measures].[TEST] } ON COLUMNS
FROM [DataCubeName]
WHERE
{
[Organization Structure].[Parent Id].&[123],
[Organization Structure].[Parent Id].&[124]
}

Я получаю сообщение об ошибке, что "текущий элемент не выполнен, потому что координата для атрибута содержит набор".

Вот почему в моем выражении я пытался использовать функцию ITEM(0) во многих различных конфигурациях, но я просто не мог найти способ использовать ее для набора элементов, которые в настоящее время используются в предложении WHERE... Так что большой вопрос:

Как получить набор элементов, перечисленных в предложении WHERE, которое выполняется в данный момент, чтобы я мог использовать Item(0) для этого набора, или есть какой-либо другой способ получения уровня выбранных в данный момент элементов, зная, что они должны быть тот же уровень?

1 ответ

Решение

С помощью Currentmember в сочетании с set в where Положение потенциально проблематично.

Смотрите этот пост от Криса Уэбба: http://blog.crossjoin.co.uk/2009/08/08/sets-in-the-where-clause-and-autoexists/

Вот возможный обходной путь для вашей ситуации: вы можете попытаться адаптироваться к вашей ситуации.

WITH 
  MEMBER [Measures].[x] AS 
    IIF
    (
       (existing [Geography].[Geography].[State-Province].members).item(0).Level
      IS 
       [Geography].[Geography].[State-Province]
     ,'THIS IS state'
     ,'THIS IS NOT'
    ) 
SELECT 
  {[Measures].[x]} ON COLUMNS
FROM [Adventure Works]
WHERE
(
{[Geography].[Geography].[State-Province].&[77]&[FR],
[Geography].[Geography].[State-Province].&[59]&[FR]}
);

Расширяя вышесказанное, чтобы доказать, что это работает:

WITH 
  MEMBER [Measures].[x] AS 
    IIF
    (
        (EXISTING 
          [Geography].[Geography].[State-Province].MEMBERS).Item(0).Level
      IS 
        [Geography].[Geography].[State-Province]
     ,'THIS IS state'
     ,'THIS IS NOT'
    ) 
  MEMBER [Measures].[proof] AS 
    (EXISTING 
      [Geography].[Geography].[State-Province].MEMBERS).Item(0).Member_Caption 
  MEMBER [Measures].[proof2] AS 
    (EXISTING 
      [Geography].[Geography].[State-Province].MEMBERS).Count 
SELECT 
  {
    [Measures].[x]
   ,[Measures].[proof]
   ,[Measures].[proof2]
  } ON COLUMNS
FROM [Adventure Works]
WHERE 
  {
    [Geography].[Geography].[State-Province].&[77]&[FR]
   ,[Geography].[Geography].[State-Province].&[59]&[FR]
  };

Результаты в следующем:

введите описание изображения здесь

Таким образом, ваше выражение может выглядеть примерно так:

IIF
(
    (EXISTING 
      [Organization Structure].[Parent Id].MEMBERS).Item(0).Level
  IS 
    [Organization Structure].[Parent Id].[Level 05]
 ,'THIS IS STORE'
 ,'THIS IS NOT'
)
Другие вопросы по тегам