ParallelPeriod выдает, когда время не на оси - PullRequest
1 голос
/ 04 ноября 2019

Что не так с вычисленным членом [Сумма LM] (= сумма за последний месяц) в этом запросе? Кажется, это работает, если я указываю время в строках, но не получается, если я этого не делаю, хотя у меня есть дата в предложении where.

WITH

MEMBER [Amount LM] as
    (
        [Measures].[Amount],

        ParallelPeriod (
            [Date].[Year - Quarter - Month - Date - Hierarchy].[Year and Month],
            1,
            [Date].[Year - Quarter - Month - Date - Hierarchy].CurrentMember
        )
    )


SELECT 
   {[Amount LM], [Measures].[Amount]} ON  COLUMNS,

[Measure Types].[Name].&[22] --not related to [Measures].[Amount]; Used as a measure switch in the real case but adjusted here for simplicity
-- comment out the next line to fail
* [Date].[Year - Quarter - Month - Date - Hierarchy].[Year and Month] 

ON rows


FROM [Cube]
WHERE [Date].[Year Number].&[2019]
;

Результат в рабочем случае:

                           Amount LM  |  Amount
    Costs  |    Jan 2019  | (null)    |  109600
    Costs  |    Feb 2019  | 109600    |  218300.5
    Costs  |    Mar 2019  | 218300.5  |  392250
    Costs  |    Apr 2019  | 392250    |  206800
    Costs  |    May 2019  | 206800    |  174700
    Costs  |    Jun 2019  | 174700    |  298400
    Costs  |    Jul 2019  | 298400    |  264550
    Costs  |    Aug 2019  | 264550    |  424100
    Costs  |    Sep 2019  | 424100    |  129650
    Costs  |    Oct 2019  | 129650    |  330050
    Costs  |    Nov 2019  | 330050    |  (null)
    Costs  |    Dec 2019  | (null)    |  (null)

Без части

* [Date].[Year - Quarter - Month - Date - Hierarchy].[Year and Month] 

, сумма LM is NULL

          |Amount LM| Amount
    Costs | (null)  | 2548400.5

1 Ответ

2 голосов
/ 07 ноября 2019

Нет проблем с вашим расчетом. Чтобы понять значение Null, вам нужно знать

  1. Как работает ParallelPeriod
  2. Как работает "CurrentMember" в иерархии пользователей

Когда у вас есть

"[Дата]. [Год - Квартал - Месяц - Дата - Иерархия]. [Год и месяц]"

по оси строк

"[Дата]. [Год - Квартал - Месяц - Дата - Иерархия] .CurrentMember"

Вышеприведенное выражение ".currentmember" возвращает текущего члена Иерархии пользователей "[Год - Квартал - Месяц»- Дата - Иерархия] ". Затем функция PARALLEL PERIOD пытается найти члена двоюродного брата относительно уровня "[Year and Month]".

Когда вы удаляете пользовательскую иерархию из строк, текущий член возвращает 2019, который является членом УРОВНЯ «ГОДОВОЙ КОД», следовательно, параллельный период не может найти двоюродного брата по отношению к УРОВНЮ «[Год и месяц]» (так как пройденный текущий элемент выше указанного УРОВНЯ). Чтобы проверить, замените год в, где с членом месяца (и без даты в строках) это будет работать. Чтобы решить эту проблему, вам нужно предоставить альтернативный логический случай, если член более высокого уровня пройден или другие крайние случаи используют сценарий ниже, который вернет 100 в любом крайнем случае.

WITH

MEMBER [Amount LM] as
case when [Date].[Year - Quarter - Month - Date - Hierarchy].CurrentMember.level.name <>"Year and Month" then 100
else 
(
    [Measures].[Amount],

    ParallelPeriod (
        [Date].[Year - Quarter - Month - Date - Hierarchy].[Year and Month],
        1,
        [Date].[Year - Quarter - Month - Date - Hierarchy].CurrentMember
    )
)
end

Ниже приведен примервашей проблемы на приключенческих работах. Я добавил два столбца, чтобы проверить, что возвращают ParallelPeriod и .currentmember

WITH
MEMBER [Amount LM] as
(
    [Measures].[Internet Sales Amount],
    ParallelPeriod ([Date].[Calendar].[Month],1,[Date].[Calendar].currentmember)
)

MEMBER [Amount LM_ParallelPeriodName] as
(
    ParallelPeriod ([Date].[Calendar].[Month],1,[Date].[Calendar].currentmember).name
)

MEMBER [Amount LM_CalendarCurrentmember] as
(
    [Date].[Calendar].currentmember.name
)

SELECT 
{[Amount LM], [Measures].[Internet Sales Amount],[Amount LM_ParallelPeriodName],[Amount LM_CalendarCurrentmember]} ON  COLUMNS,
[Product].[Category].&[1] * [Date].[Calendar].[Month]
ON rows
from [Adventure Works]
WHERE [Date].[Calendar Year].&[2013]

Результат FirstResult

Теперь давайте прокомментируем

"[Дата]. [Календарь]. [Месяц]"

WITH
MEMBER [Amount LM] as
(
    [Measures].[Internet Sales Amount],
    ParallelPeriod ([Date].[Calendar].[Month],1,[Date].[Calendar].currentmember)
)

MEMBER [Amount LM_ParallelPeriodName] as
(
    ParallelPeriod ([Date].[Calendar].[Month],1,[Date].[Calendar].currentmember).name
)

MEMBER [Amount LM_CalendarCurrentmember] as
(
    [Date].[Calendar].currentmember.name
)

SELECT 
{[Amount LM], [Measures].[Internet Sales Amount],[Amount LM_ParallelPeriodName],[Amount LM_CalendarCurrentmember]} ON  COLUMNS,
[Product].[Category].&[1] --* [Date].[Calendar].[Month]
ON rows
from [Adventure Works]
WHERE [Date].[Calendar Year].&[2013]

Результат Result2 Обратите внимание на значение Null, возвращаемое ParallelPeriod, теперь давайте заменим год воткуда с месяца. Это позволяет paralellperiod возвращать что-то полезное

WITH
MEMBER [Amount LM] as
(
    [Measures].[Internet Sales Amount],
    ParallelPeriod ([Date].[Calendar].[Month],1,[Date].[Calendar].currentmember)
)

MEMBER [Amount LM_ParallelPeriodName] as
(
    ParallelPeriod ([Date].[Calendar].[Month],1,[Date].[Calendar].currentmember).name
)

MEMBER [Amount LM_CalendarCurrentmember] as
(
    [Date].[Calendar].currentmember.name
)

SELECT 
{[Amount LM], [Measures].[Internet Sales Amount],[Amount LM_ParallelPeriodName],[Amount LM_CalendarCurrentmember]} ON  COLUMNS,
[Product].[Category].&[1] * [Date].[Calendar].[Month]
ON rows
from [Adventure Works]
WHERE [Date].[Month Name].[September 2013]

Результат enter image description here

...