Это одни из наиболее востребованных типов расчетных элементов в бизнес-аналитике. Они позволяют сравнивать части с целым или текущие показатели с прошлыми.
Процентный вклад
Расчет процентного вклада элемента в общую сумму (например, доля продаж продукта в категории). Для этого нам нужно "отменить" фильтр по текущему элементу и получить общую сумму.
Пример 5: Процент продаж подкатегории от общей суммы продаж категории (Sales % of Parent Category)
Мы хотим видеть, какую долю составляет каждая подкатегория (например, 'Road Bikes') от общей суммы продаж своей родительской категории ('Bikes').
WITH MEMBER [Measures].[Sales % of Parent Category] AS
IIF(
IsEmpty(([Measures].[Sales Amount], [Product].[Category].CurrentMember)),
NULL,
[Measures].[Sales Amount] / ([Measures].[Sales Amount], [Product].[Category].CurrentMember.Parent)
)
, FORMAT_STRING = "Percent"
SELECT
{[Measures].[Sales Amount], [Measures].[Sales % of Parent Category]} ON COLUMNS,
NON EMPTY [Product].[Subcategory].Members ON ROWS
FROM
[Adventure Works]
WHERE
[Date].[Calendar Year].&[2007]
Разбор:
● [Product].[Category].CurrentMember.Parent: Этоключевоймомент. CurrentMember ссылается на текущий член на оси (в данном случае, подкатегорию). .Parent возвращает его родительский член (категорию).
● ([Measures].[Sales Amount], [Product].[Category].CurrentMember.Parent): Этот кортеж вычисляет сумму продаж для родительской категории текущей подкатегории, тем самым "отменяя" фильтр по подкатегории и позволяя получить общий итог для категории.
● IsEmpty() используется для обработки случаев, когда родительская категория может быть пустой, предотвращая деление на ноль.
Темпы роста (Year-over-Year Growth)Сравнение текущих показателей с аналогичным периодом прошлого года является стандартным требованием. MDX предлагает функции навигации по времени, такие как PrevMember или ParallelPeriod.
Пример 6: Темп роста продаж год к году (Sales Growth % YOY)
Мы хотим видеть, насколько изменились продажи по сравнению с тем же периодом предыдущего года.
WITH MEMBER [Measures].[Sales Growth % YOY] AS
IIF(
IsEmpty(([Measures].[Sales Amount], [Date].[Calendar].CurrentMember.PrevMember)),
NULL,
([Measures].[Sales Amount] - ([Measures].[Sales Amount], [Date].[Calendar].CurrentMember.PrevMember)) / ([Measures].[Sales Amount], [Date].[Calendar].CurrentMember.PrevMember)
)
, FORMAT_STRING = "Percent"
SELECT
{[Measures].[Sales Amount], [Measures].[Sales Growth % YOY]} ON COLUMNS,
NON EMPTY [Date].[Calendar].[Calendar Year].Members ON ROWS
FROM
[Adventure Works]
Разбор:
● [Date].[Calendar].CurrentMember.PrevMember: Эта функция возвращает член, предшествующий текущему члену в иерархии времени. Если CurrentMember — это 2007 год, PrevMember вернет 2006 год.
● ([Measures].[Sales Amount], [Date].[Calendar].CurrentMember.PrevMember): Этот кортеж получает сумму продаж за предыдущий период.
● Формула (Текущие продажи - Продажи прошлого периода) / Продажи прошлого периода дает процентный рост.
● IsEmpty() снова используется для предотвращения деления на ноль, если данные за предыдущий период отсутствуют.