В SSAS не может заставить функцию ParallelPeriod работать при пересечении месяцев и лет - PullRequest
1 голос
/ 15 марта 2011

Я создаю запрос MDX для куба Adventure Works в Analysis Services 2008R2. Я хочу получить месяцы в строках и годы в столбцах, чтобы результат выглядел следующим образом:

          2005 | 2006 | 2007 | ...
January    ... |  ... |  ... | ...
February   ... |  ... |  ... | ...
March      ... |  ... |  ... | ...
...

Следующий запрос работает нормально:

SELECT 
[Date].[Month of Year].CHILDREN ON ROWS,
( [Date].[Calendar Year].CHILDREN, { [Measures].[Sales Amount] } ) ON COLUMNS
FROM [Adventure Works]

Теперь я хотел бы сравнить продажи текущего месяца с продажами предыдущего месяца:

               2005                ||      2006                || ...
          Sales | Sales prev month || Sales | Sales prev month ||...
January     ... |              ... ||   ... |              ... || ...
February    ... |              ... ||   ... |              ... || ...
March       ... |              ... ||   ... |              ... || ...
...

Я написал запрос, используя функцию ParallelPeriod:

WITH MEMBER [Sales Amount Prev Month] AS ([Measures].[Sales Amount], ParallelPeriod([Date].[Calendar].[Month], 1))
SELECT
[Date].[Month of Year].CHILDREN ON ROWS,
( [Date].[Calendar Year].CHILDREN, { [Measures].[Sales Amount], [Sales Amount Prev Month] } ) ON COLUMNS
FROM [Adventure Works]

Проблема в том, что я получаю значения NULL для показателя [Sales Amount Prev Month].

Похоже, что, несмотря на то, что каждая ячейка представляет месяц и год, SSAS, похоже, не может определить текущего члена [Date]. [Calendar]. [Month]. Тогда ParallelPeriod не удается получить предыдущий месяц.

Есть идеи о том, как заставить функцию ParallelPeriod работать в этом случае? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Я получил следующий запрос MDX от Microsoft:

WITH MEMBER [Sales Amount Prev Month] AS ([Measures].[Sales Amount], ParallelPeriod([Date].[Calendar].[Month], 1))
member measures.def2
as
([Measures].[Sales Amount], ParallelPeriod(
    [Date].[Calendar].[Month],
    1,         
    exists(
        descendants([Date].[Calendar].currentmember,[Date].[Calendar].[Month],SELF),
        [Date].[Month of Year].currentmember).item(0)
        )
)
SELECT
[Date].[Month of Year].CHILDREN ON ROWS,
( [Date].[Calendar Year].CHILDREN, { [Measures].[Sales Amount], [Sales Amount Prev Month],def2 } ) ON COLUMNS
FROM [Adventure Works]

Это довольно сложно, но, похоже, это решает проблему.

0 голосов
/ 16 марта 2011

А как же:

WITH MEMBER [Sales Amount Prev Month] AS ([Measures].[Sales Amount], [Date].[Month of Year].CurrentMember.PrevMember),
FORMAT_STRING = "Currency"
SELECT
[Date].[Month of Year].CHILDREN ON ROWS,
( [Date].[Calendar Year].CHILDREN, { [Measures].[Sales Amount], [Sales Amount Prev Month] } ) ON COLUMNS
FROM [Adventure Works]

Параллельный период используется, когда вы хотите соответствующий месяц в предыдущем квартале. Здесь PrevMember должно быть достаточно.

Обновление: после вашего комментария я попытался использовать иерархии, уже существующие в другом решении:

WITH 
MEMBER [Sales Amount Prev Month] AS 
    ([Measures].[Sales Amount], [Date].Calendar.currentMember.prevMember), 
FORMAT_STRING = "Currency"

SELECT
{[Date].[Calendar].[Month].Members} ON ROWS,
(  { [Measures].[Sales Amount], [Sales Amount Prev Month] } ) ON COLUMNS
FROM [Adventure Works]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...