Давайте рассмотрим несколько более сложных сценариев с использованием именованных наборов и данных AdventureWorks.
Пример 3: Анализ продаж для 'Премиум-клиентов' и 'Основных продуктов' по кварталам
Предположим:
● Премиум-клиенты: Клиенты, чьи интернет-продажи за 2007 год превысили $5,000.
● Основные продукты: Продукты, относящиеся к категориям 'Bikes' и 'Components'.
Мы хотим увидеть продажи этих продуктов для этих клиентов по кварталам 2007 года.
WITH SET [Premium Customers 2007] AS
Filter(
[Customer].[Customer].[Customer].Members,
([Measures].[Internet Sales Amount], [Date].[Calendar Year].&[2007]) > 5000
)
SET [Core Products] AS
{[Product].[Category].&[Bikes], [Product].[Category].&[Components]}
SELECT
[Measures].[Sales Amount] ON COLUMNS,
NON EMPTY [Date].[Calendar].[Calendar Quarter].Members ON ROWS
FROM
[Adventure Works]
WHERE
([Premium Customers 2007], [Core Products], [Date].[Calendar Year].&[2007])
Разбор:
● Мы определили два именованных набора: [Premium Customers 2007] и [Core Products].
● Затем мы использовали эти наборы в WHERE Clause, создавая кортеж, который фильтрует весь куб по этим конкретным группам клиентов и продуктов, а также по 2007 году.
● На оси ROWS мы видим продажи по кварталам, но только для пересечения этих двух групп.
Этот запрос демонстрирует, как именованные наборы позволяют создавать очень специфические срезы данных, не загромождая основной запрос сложными выражениями.
Пример 4: Процентный вклад каждой подкатегории в 'Топ-5 Категорий по Продажам' за 2008 год
Здесь мы комбинируем TopCount для категорий и расчет процента вклада для подкатегорий.
WITH SET [Top 5 Categories 2008] AS
TopCount(
[Product].[Category].Members,
5,
([Measures].[Sales Amount], [Date].[Calendar Year].&[2008])
)
MEMBER [Measures].[Sales % of Parent Category] AS
IIF(
IsEmpty(([Measures].[Sales Amount], [Product].[Category].CurrentMember.Parent)),
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
Generate(
[Top 5 Categories 2008],
[Product].[Category].CurrentMember.Children
) ON ROWS
FROM
[Adventure Works]
WHERE
[Date].[Calendar Year].&[2008]
Разбор:
● Мы определили именованный набор [Top 5 Categories 2008], который содержит 5 самых продаваемых категорий продуктов в 2008 году.
● Мы также определили расчетную меру [Sales % of Parent Category], которая вычисляет процент продаж подкатегории от ее родительской категории.
● На оси ROWS мы используем функцию Generate(). Она итерирует по каждому члену в [Top 5 Categories 2008] и для каждого из них возвращает набор его дочерних элементов (подкатегорий). Таким образом, мы получаем список всех подкатегорий, принадлежащих к этим топ-5 категориям.
● Результат показывает продажи и процентный вклад для каждой подкатегории внутри ее родительской категории, но только для тех категорий, которые вошли в наш "Топ-5".
Этот пример наглядно демонстрирует, как именованные наборы могут быть использованы в сочетании с другими мощными функциями MDX (Generate, TopCount, CurrentMember.Parent) для создания очень точных и сложных аналитических отчетов.