КубЛаб

Куб, измерения и меры на одном примере

Разбираем устройство куба на продажах сети магазинов: срезы, иерархии и агрегаты.

Статья 2 из 3 в рубрике, 2 мин чтения

Слово «куб» пугает тех, кто впервые сталкивается с OLAP, хотя за ним стоит простая идея. Разберём её на примере сети магазинов, которая хочет анализировать продажи.

Меры: что считаем

Мера — числовой показатель, который можно складывать или как-то иначе агрегировать: выручка, количество проданных единиц, себестоимость, число чеков. Меры отвечают на вопрос «сколько?».

Некоторые меры вычисляются из других. Валовая прибыль — это выручка минус себестоимость, средний чек — выручка, делённая на число чеков. Такие вычисляемые меры описываются в модели формулой и пересчитываются на лету для любого среза.

Измерения: в каком разрезе считаем

Измерение — справочник, по которому группируются меры: время, магазин, товар, покупатель. Измерения отвечают на вопросы «когда?», «где?», «что?» и «кто?».

У измерения есть атрибуты (у товара: бренд, категория, цвет) и иерархии — заранее заданные пути детализации:

Измерение Иерархия
Время Год → Квартал → Месяц → День
Магазин Регион → Город → Магазин
Товар Категория → Подкатегория → Товар

Иерархии позволяют пользователю «проваливаться» от года к месяцу или от региона к конкретному магазину в один клик.

Куб: пересечение всего со всем

Представьте три измерения как оси: время, магазин, товар. Каждая комбинация значений — ячейка, а в ячейке лежат меры. Выручка молочной продукции в магазинах Северо-Запада в марте — это одна ячейка такого куба. Если измерений больше трёх, геометрическая картинка ломается, но принцип остаётся: куб — это все возможные пересечения измерений.

С кубом работают несколькими типичными операциями:

  • срез — фиксируем одно значение измерения, например «только 2025 год»;
  • детализация и свёртка — движемся вниз или вверх по иерархии;
  • поворот — меняем местами строки и столбцы отчёта.

Почему это быстро

Сервер не пересчитывает миллионы строк продаж каждый раз. В многомерной модели SSAS часть агрегатов (например, выручка по месяцам и регионам) хранится заранее. В табличной модели данные лежат в памяти в сжатом колоночном формате, и суммирование по нужным колонкам идёт очень быстро. В обоих случаях отчёт открывается за секунды.

Как выглядит запрос

Пользователь обычно не пишет запросов: он перетаскивает поля в сводной таблице. Но под капотом Excel отправляет запрос на языке MDX:

SELECT
  [Measures].[Выручка] ON COLUMNS,
  [Магазин].[Регион].MEMBERS ON ROWS
FROM [Продажи]
WHERE [Время].[Месяц].&[2025-03]

А для табличной модели меры описывают на языке DAX:

Валовая прибыль := SUM ( Продажи[Выручка] ) - SUM ( Продажи[Себестоимость] )
Средний чек := DIVIDE ( [Выручка], DISTINCTCOUNT ( Продажи[НомерЧека] ) )

Формула пишется один раз и работает в любом разрезе: по магазину, по месяцу, по бренду.

Чтобы модель работала, под ней должны лежать правильно подготовленные данные. Об этом — в статье о схеме «звезда».