Нет проблем с вашим расчетом. Чтобы понять значение Null, вам нужно знать
- Как работает ParallelPeriod
- Как работает "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]
Результат
Теперь давайте прокомментируем
"[Дата]. [Календарь]. [Месяц]"
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]
Результат Обратите внимание на значение 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]
Результат