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'
)