Нарастающие итоги (Year-to-Date, Quarter-to-Date, Month-to-Date) — это одни из самых востребованных аналитических показателей. Они показывают сумму показателя с начала определенного периода (года, квартала, месяца) до текущей даты. MDX предлагает специализированные функции для их вычисления.
PeriodsToDate(): Универсальная функция для нарастающих итогов Функция PeriodsToDate() является наиболее универсальной для вычисления нарастающих итогов. Она суммирует значения меры от начала указанного уровня иерархии времени до текущего члена.
Синтаксис:
PeriodsToDate(Level_Expression, Member_Expression)
● Level_Expression: Уровень иерархии времени, с которого начинается агрегация (например, уровень года для YTD, уровень квартала для QTD).
● Member_Expression: Член иерархии времени, до которого производится агрегация (обычно CurrentMember на оси).
Пример 1: Продажи YTD (Year-to-Date) для AdventureWorks
Рассчитаем нарастающие продажи с начала года до текущего месяца.
WITH MEMBER [Measures].[Sales Amount YTD] AS
Sum(
PeriodsToDate(
[Date].[Calendar].[Calendar Year], -- Уровень, скоторогоначинаемагрегацию(год)
[Date].[Calendar].CurrentMember-- Текущий член (месяц, квартал или день)
),
[Measures].[Sales Amount]
)
, FORMAT_STRING = "Currency"
SELECT
{[Measures].[Sales Amount], [Measures].[Sales Amount YTD]} ON COLUMNS,
NON EMPTY [Date].[Calendar].[Month].Members ON ROWS
FROM
[Adventure Works]
WHERE
[Date].[Calendar Year].&[2007]
Разбор:
● [Date].[Calendar].[Calendar Year]: Указывает, что мы хотим агрегировать с начала каждого календарного года.
● [Date].[Calendar].CurrentMember: Указывает, что агрегация идет до текущего члена на оси ROWS (в данном случае, до каждого месяца).
● Sum(...): Суммирует [Sales Amount] по всем членам, возвращенным PeriodsToDate().
● Мы отображаем это по месяцам 2007 года.
Пример 2: Продажи QTD (Quarter-to-Date) для AdventureWorks
Аналогично, для квартальных итогов:
WITH MEMBER [Measures].[Sales Amount QTD] AS
Sum(
PeriodsToDate(
[Date].[Calendar].[Calendar Quarter], -- Уровень, с которого начинаем агрегацию (квартал)
[Date].[Calendar].CurrentMember-- Текущий член (месяц или день)
),
[Measures].[Sales Amount]
)
, FORMAT_STRING = "Currency"
SELECT
{[Measures].[Sales Amount], [Measures].[Sales Amount QTD]} ON COLUMNS,
NON EMPTY [Date].[Calendar].[Month].Members ON ROWS
FROM
[Adventure Works]
WHERE
[Date].[Calendar Year].&[2007]
Разбор:
● Здесь Level_Expression — [Date].[Calendar].[Calendar Quarter], что означает агрегацию с начала каждого квартала.
Пример 3: Продажи MTD (Month-to-Date) для AdventureWorks
Для месячных итогов:
WITH MEMBER [Measures].[Sales Amount MTD] AS
Sum(
PeriodsToDate(
[Date].[Calendar].[Date], -- Уровень, с которого начинаем агрегацию (день, если хотим MTD по дням)
[Date].[Calendar].CurrentMember -- Текущий член (день)
),
[Measures].[Sales Amount]
)
, FORMAT_STRING = "Currency"
SELECT
{[Measures].[Sales Amount], [Measures].[Sales Amount MTD]} ON COLUMNS,
NON EMPTY [Date].[Calendar].[Date].Members ON ROWS
FROM
[Adventure Works]
WHERE
[Date].[Calendar].[Month].&[2007]&[7] -- Пример для июля 2007 года
Разбор:
● Для MTD мы обычно агрегируем с начала месяца до текущего дня. Поэтому Level_Expression может быть уровнем [Date] (если у вас есть иерархия до уровня дня) или уровнем [Month] в зависимости от детализации.
Сокращенные функции для YTD, QTD, MTDMDX также предоставляет более короткие, специфические функции для YTD, QTD, MTD, которые являются синтаксическим сахаром для PeriodsToDate():
● YTD(): Sum(PeriodsToDate([Date].[Calendar].[Calendar Year], CurrentMember), Measure)
● QTD(): Sum(PeriodsToDate([Date].[Calendar].[Calendar Quarter], CurrentMember), Measure)
● MTD(): Sum(PeriodsToDate([Date].[Calendar].[Month], CurrentMember), Measure)
Пример 4: Использование YTD() для продаж AdventureWorks
WITH MEMBER [Measures].[Sales Amount YTD (Short)] AS
YTD([Date].[Calendar].CurrentMember, [Measures].[Sales Amount])
, FORMAT_STRING = "Currency"
SELECT
{[Measures].[Sales Amount], [Measures].[Sales Amount YTD (Short)]} ON COLUMNS,
NON EMPTY [Date].[Calendar].[Month].Members ON ROWS
FROM
[Adventure Works]
WHERE
[Date].[Calendar Year].&[2007]
Эти сокращенные функции удобны, но важно понимать, что за ними стоит логика PeriodsToDate().