ограничения многомерности в выражении MDX where - PullRequest
0 голосов
/ 15 декабря 2008

У меня следующая проблема. Если я запрашиваю значения с помощью ключевой фигуры, которая является функцией, я не могу указать несколько значений одного и того же ограничения измерения, но если это не функция, это работает.

Так что это работает:

SELECT {[Measures].[Netto]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]), 
  NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])})

Но это не так:

SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]), 
 NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])})

И это тоже работает:

SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where 
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00])})

Я полагаю, что решение - это что-то вроде добавления предложения where к заголовку, но мне действительно нравится это решение, потому что оно очень простое.

Функция Calucated:

CREATE MEMBER CURRENTCUBE.[MEASURES].Ultimo
AS (iif ((not [Time].[Year - Month - Date].currentmember is [Time].[Year - Month - Date].defaultmember),
IIF(NOT ([Measures].[LagerStk] = 0),
Sum([Time].[Year - Month - Date].[Date].members(0):
ClosingPeriod([Time].[Year - Month - Date].[Date]),
[Measures].[LagerStk]), NULL)
, 
IIF(NOT ([Measures].[LagerStk] = 0),
Sum([Time].[Year - Week - Date].[Date].members(0):
ClosingPeriod([Time].[Year - Week - Date].[Date]),
[Measures].[LagerStk]), NULL))), 
VISIBLE = 1;

Код основан на этом и изменен для двух иерархий во временном измерении: http://www.sqlserveranalysisservices.com/OLAPPapers/InventoryManagement%20in%20AS2005v2.htm

Это на SQL Server 2005 Enterprise Edition.

Ответы [ 2 ]

1 голос
/ 16 декабря 2008

Хорошо, это работает:

WITH MEMBER [Time].[Month].a AGGREGATE 
({[Time].[Month].[Month].&[2008-03-01T00:00:00], 
  [Time].[Month].[Month].&[2008-04-01T00:00:00]})
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where a
0 голосов
/ 04 февраля 2009

Проблема в вашей расчетной мере. Вы используете .CurrentMember и ClosingPeriod без специальной ссылки на член, которая подразумевает вызов .CurrentMember. Если вы задали в предложении WHERE, элемент «Текущий» отсутствует - имеется несколько текущих элементов. Перезапись вашего MDX в нечто вроде следующего должно позволить ему работать с несколькими членами в предложении WHERE.

CREATE 
  MEMBER CURRENTCUBE.[MEASURES].Ultimo AS NULL;

SCOPE ([MEASURES].Ultimo);
      SCOPE ([Time].[Year - Month - Date].[All]);
        this = IIF
          (
            (NOT 
              [Measures].[LagerStk] = 0)
           ,Sum
            (
             NULL:Tail(Existing [Time].[Year - Week - Date].[Date],1).item(0).item(0)
             ,[Measures].[LagerStk]
            )
           ,NULL
          );
      END SCOPE;

      SCOPE ([Time].[Year - Week - Date].[All]);
        this = IIF
          (
            (NOT 
              [Measures].[LagerStk] = 0)
           ,Sum
            (
             NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0)
             ,[Measures].[LagerStk]
            )
           ,NULL
          )
        ); 
     END SCOPE;
END SCOPE;

Я использую SCOPE для всех членов двух измерений, это должно быть быстрым, как выход из IIF, а также избегать одной ссылки на .CurrentMember. Затем я заменил вызов ClosingPeriod () на Tail (Существующий [Время]. [Год - Неделя - Дата]. [Дата], 1) .item (0) .item (0) что это делает, чтобы получить набор элементов даты, которые существуют в текущем контексте, то вызов Tail () затем получает последний из них как один набор элементов, а вызовы .Item (0) .Item (0) получить первого члена из первого набора этого набора.

Очевидно, что, не имея доступа к вашему кубу, я не могу ничего проверить. Проблема, о которой вы сообщили в своем комментарии, может быть связана с неверной ссылкой на всех участников (у меня может быть другой формат именования, чем в вашем кубе), или это может быть связано с оператором IIF (). Я не уверен, что проверка на 0 выполняется в правильном контексте

Вы можете попробовать тестировать без ИИФ ()

CREATE ЧЛЕН CURRENTCUBE. [МЕРЫ] .Ultimo AS NULL;

ОБЛАСТЬ ПРИМЕНЕНИЯ ([ИЗМЕРЕНИЯ]. Ультимо); ОБЛАСТЬ ПРИМЕНЕНИЯ ([Время]. [Год - Месяц - Дата]. [Все]); это = сумма ( NULL: Хвост (Существующий [Время]. [Год - Неделя - Дата]. [Дата], 1) .item (0) .item (0) , [Меры]. [LagerStk] ); КОНЕЦ ОБЛАСТИ;

  SCOPE ([Time].[Year - Week - Date].[All]);
    this = Sum
        (
         NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0)
         ,[Measures].[LagerStk]
        ); 
 END SCOPE;

КОНЕЦ ОБЛАСТИ;

...