2015-05-27 2 views
3

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

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

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

expression from datacube

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

и так же для использования запросов многомерных выражений, как:

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] 
} 

I получить ошибку, которая «currentmember failed, потому что координата для атрибута содержит набор».

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

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

+0

Почему вы заинтересованы в том, чтобы иметь более одного члена в предложении WHERE?, Когда все эти значения относятся к одной и той же иерархии? Можно ли этого избежать? – SouravA

+1

Спасибо за ответ! Я заинтересован в том, чтобы иметь более одного члена, так как я использую один запрос MDX для получения, например, данных о прибыли от продаж для 10 магазинов одновременно или для 10 регионов и т. Д. Дело в том, что я хотел бы сделать разные расчет в зависимости от типа уровня, как в примере, который я использовал выше, в моем случае прибыль будет рассчитываться по-разному для магазинов и регионов. Надеюсь, что я разъяснил свое прецедентное право. –

+0

Получил это. Является ли иерархия, в которой члены должны принадлежать, будет одинаковой или может варьироваться? Например, здесь у вас есть члены из '[Organization Structure]. [Parent Id]' dimension. Это исправлено, или может быть другая иерархия? – SouravA

ответ

0

Использование Currentmember в сочетании с set в статье where является потенциально проблематичным.

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

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

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] 
    }; 

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

enter image description here

Так что ваше выражение может стать чем-то вроде следующего:

IIF 
(
    (EXISTING 
     [Organization Structure].[Parent Id].MEMBERS).Item(0).Level 
    IS 
    [Organization Structure].[Parent Id].[Level 05] 
,'THIS IS STORE' 
,'THIS IS NOT' 
) 
+0

Это не совсем так, как '(СУЩЕСТВУЮЩАЯ [Структура организации]. [Родительский идентификатор] .MEMBERS) .ITEM (0)' указывает на первый элемент иерархии ** цели **, а не первый элемент из набора где статья –

+0

Привет, Bartek - пример AdvWrks, который я представил, является полностью протестированным примером - эта техника * работает * - Я расширю его, чтобы доказать это вам. Пожалуйста, поиграйте, адаптировав его к вашему кубу. – whytheq

+1

'(СУЩЕСТВУЮЩАЯ' - это функция, которая означает, что она не указывает на всю иерархию. – whytheq

Смежные вопросы