Построение финансовой модели в Power BI: Star Schema, DAX, PL-300 | AiManual
AiManual Logo Ai / Manual.
11 Янв 2026 Гайд

Финансовая модель в Power BI: от хаоса плоской таблицы к элегантной Star Schema

Практический гайд по созданию enterprise-финансовой модели в Power BI. От плоской таблицы до Star Schema, DAX-метрики YTD, решение проблем гранулярности. Для по

Почему ваша финансовая модель тормозит и сломается завтра

Вы загружаете в Power BI огромный CSV с транзакциями. Делаете пару сводных таблиц. Все работает. Пока не добавляете фильтр по месяцам. Пока не пытаетесь посчитать накопленный итог. Пока ваш руководитель не просит "а покажи это в разрезе продуктов и регионов одновременно".

Вот она — классическая ловушка плоской таблицы. 500 тысяч строк, 40 колонок. Дата транзакции, ID продукта, название продукта, категория, регион, менеджер, сумма, валюта, себестоимость, маржа... Все в одной куче.

Главная ошибка новичков: думать, что Power BI — это просто Excel на стероидах. Нет. Это реляционная модель, которая ненавидит дублирование данных и обожает связи один-ко-многим.

Star Schema: не модное словечко, а лекарство от головной боли

Забудьте про теорию баз данных из университета. Star Schema в Power BI — это просто:

  • Одна большая таблица фактов (что произошло)
  • Несколько маленьких таблиц измерений (по каким параметрам смотреть)
  • Связи от измерений к фактам (только в одну сторону)

Почему это работает? Потому что DAX (язык вычислений Power BI) создан для такой структуры. Каждая метрика считается один раз в контексте фильтров. Не нужно пересчитывать миллионы строк при каждом изменении среза.

💡
На сертификации PL-300 Star Schema — обязательный пункт. Экзаменаторы специально дают задачи с плоскими таблицами, чтобы проверить, умеете ли вы их нормализовать. Если сдаете таблицу фактов с повторяющимися названиями продуктов — провал.

Разборка плоской таблицы: пошаговая хирургия

1 Диагностика: что у вас вообще есть?

Откройте Power Query (не панель данных, а именно редактор запросов). Посмотрите на колонки. Разделите их на три категории:

Факты (меры) Измерения (атрибуты) Технические поля
Сумма продажи, Количество, Себестоимость Дата транзакции, ID продукта, Регион ID транзакции, Хэш-сумма
Маржа (вычисляемая) Категория продукта, Менеджер Версия записи, Флаг удаления

Технические поля часто забывают. А они критичны для инкрементальной загрузки и отслеживания изменений. Если ваша финансовая система не возвращает флаг "удалено" — требуйте этого от разработчиков. Иначе ваши отчеты будут врать.

2 Выделение таблицы фактов: ядро модели

Создайте новый запрос. Оставьте только:

  • Ключи связи (ProductID, DateID, RegionID)
  • Меры (Amount, Quantity, Cost)
  • Технические поля (TransactionID, Timestamp)

Удалите все текстовые описания. Если у вас есть "Название продукта" в таблице фактов — это ошибка. Вынесите его в измерение продуктов.

-- Вот как НЕ надо делать
TransactionID, Date, ProductName, Amount

-- Вот как надо
TransactionID, DateID, ProductID, Amount

3 Создание измерений: маленькие и быстрые

Для каждого типа атрибутов — свой запрос:

  1. DimDate (календарь) — обязательная таблица. С полями: DateID, Date, Year, Quarter, Month, Week, DayOfWeek.
  2. DimProduct — ID, Name, Category, SubCategory, PriceSegment.
  3. DimRegion — ID, RegionName, Country, SalesManager.

Важный момент: в измерениях должны быть УНИКАЛЬНЫЕ строки. Проверяйте через "Удалить дубликаты" в Power Query. Если в DimProduct дважды встречается ProductID=101 — ваши суммы удвоятся.

Частая ошибка: создание измерения "Менеджеры" отдельно от "Регионов". Если менеджер работает в одном регионе — это одно измерение. Если менеджер может работать в нескольких регионах — нужна таблица связи many-to-many (мост). Но это уже тема для отдельной статьи.

4 Настройка связей: магия один-ко-многим

В модели данных Power BI:

  • Перетащите ProductID из FactSales в DimProduct
  • Перетащите DateID из FactSales в DimDate
  • Перетащите RegionID из FactSales в DimRegion

Стрелка всегда должна идти ОТ измерения К фактам. Проверьте направление фильтрации: должно быть "один к многим" и фильтрация "в одну сторону".

Если связей много и они запутаны — вы делаете что-то не так. В идеальной Star Schema факты в центре, измерения вокруг. Как звезда. Отсюда и название.

DAX-метрики, которые оживят вашу модель

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

Базовые меры (храните в таблице фактов)

Total Sales = SUM(FactSales[Amount])
Total Quantity = SUM(FactSales[Quantity])
Total Cost = SUM(FactSales[Cost])
Gross Margin = [Total Sales] - [Total Cost]
Gross Margin % = DIVIDE([Gross Margin], [Total Sales])

YTD (Year-to-Date) — убийца плоских таблиц

Вот где Star Schema показывает свою силу. Попробуйте посчитать накопленный итог в плоской таблице. Удачи с производительностью.

Sales YTD = 
TOTALYTD(
    [Total Sales],
    DimDate[Date],
    "31/12"  -- конец финансового года
)

Функция TOTALYTD автоматически учитывает фильтр по датам. Меняете год в срезе — метрика пересчитывается. Без перезагрузки данных.

Сравнение с предыдущим периодом

Sales Previous Year = 
CALCULATE(
    [Total Sales],
    SAMEPERIODLASTYEAR(DimDate[Date])
)

Sales Growth PY = 
DIVIDE(
    [Total Sales] - [Sales Previous Year],
    [Sales Previous Year]
)
💡
SAMEPERIODLASTYEAR работает только с правильно настроенным календарем. Если ваша DimDate содержит пропущенные даты (выходные, праздники) — функция может давать неожиданные результаты. Всегда проверяйте логику на тестовых данных.

Проблема гранулярности: когда данные не совпадают

Типичный сценарий: у вас продажи на уровне чека (одна строка = один чек). А план продаж — на уровне месяца по менеджерам. Как их сравнить?

Плохой подход: агрегировать продажи до месяца в Power Query. Вы потеряете детализацию.

Правильный подход: создать отдельную таблицу планов с нужной гранулярностью. И связать ее через мост.

-- Таблица FactPlan: ManagerID, MonthID, PlanAmount
-- Связь через DimManager и DimDate

Plan Achievement = 
DIVIDE(
    [Total Sales],
    SUM(FactPlan[PlanAmount])
)

Если гранулярности действительно не совместить (например, планы по городам, а продажи по клиентам), нужно признать: эти метрики нельзя сравнивать напрямую. Либо менять источник данных, либо искать компромиссный уровень агрегации.

Чего не рассказывают на курсах

  • Инкрементальная загрузка: ваш FactSales растет на 100К строк в день. Перезагружать все 10 миллионов каждый раз — безумие. Настройте инкрементал через Power Query (фильтр по дате изменения). Но проверьте, чтобы источник данных поддерживал такие запросы.
  • Управление памятью: Star Schema экономит память? Да. Но если в DimProduct 2 миллиона SKU с длинными названиями — все равно будет тяжело. Сжимайте текстовые поля, используйте целочисленные ключи.
  • Обработка NULL: В DAX пустые значения ведут себя неочевидно. BLANK() ≠ 0. Всегда прописывайте логику обработки пропусков:
Safe Divide = 
VAR Denominator = [Some Measure]
RETURN
IF(ISBLANK(Denominator) || Denominator = 0, 
    BLANK(), 
    DIVIDE([Numerator], Denominator)
)
  • Версионирование моделей: Вы сделали идеальную модель. Завтра бизнес попросит добавить новый атрибут "канал продаж". Не редактируйте продакшен-версию. Клонируйте PBIX, тестируйте, потом деплойте. Или используйте Power BI Deployment Pipelines, если у вас Premium.
  • Как это связано с большими данными и ИИ

    Кажется, Star Schema — архаика из 90-х. Зачем она в эпоху дата-лейков и нейросетей?

    А затем, что бизнес-пользователи все еще мыслят категориями "продажи по регионам" и "маржа по продуктам". Ваша крутая ML-модель, предсказывающая отток клиентов, бесполезна, если ее результаты нельзя встроить в привычные отчеты.

    Более того, чистая, нормализованная модель данных — это фундамент для любых аналитических надстроек. Хотите добавить синтетические данные для обучения LLM в финансах? Проще генерировать их на основе Star Schema, чем из хаотичного CSV.

    Или взгляните на проблему ИИ-ассистентов в бизнес-среде. Одна из причин провала — ассистент не понимает структуры данных. Ему подсовывают плоскую таблицу, он путается в дублирующихся полях. А с четкой Star Schema можно построить систему управления метаданными, где ИИ точно знает, где какие показатели и как они связаны.

    Что делать, если источник данных — кошмар

    Бывает. ERP-система выдает данные в ужасном формате. Нет уникальных ключей. Даты в текстовом виде. Атрибуты размазаны по пяти таблицам.

    Ваши действия:

    1. Не чините в Power BI: если проблема в источнике — решайте там. Требуйте от IT-отдела нормального API или представления в БД.
    2. Используйте промежуточный слой: загружайте сырые данные в SQL-базу или Data Lake. Там делайте очистку и трансформацию. Power BI подключайте уже к чистым данным.
    3. Документируйте все костыли: если пришлось сделать мерзкий M-код в Power Query для парсинга дат — напишите комментарий, почему так. Иначе через месяц вы сами не поймете, что здесь происходит.

    Помните: цель не в идеальной Star Schema ради схемы. Цель в том, чтобы финансовая модель работала быстро, считала правильно и масштабировалась. Если для этого нужно отступить от канонической структуры — отступайте. Но понимайте, зачем вы это делаете.

    Самый опасный момент: когда модель начинает работать. Бизнес-пользователи радуются, просят все больше отчетов. Вы добавляете новые измерения, меры, сложные вычисления. И в какой-то момент производительность падает. Рефакторинг продакшен-модели в Power BI — это боль. Лучше сразу закладывайте запас по производительности и документируйте все зависимости.

    Итог: ваш чек-лист перед сдачей модели

    • Факты отдельно, измерения отдельно? ✓
    • В измерениях нет дублей? ✓
    • Связи один-ко-многим от измерений к фактам? ✓
    • Есть календарь (DimDate) со всеми периодами? ✓
    • Базовые меры созданы через SUM, а не через вычисляемые колонки? ✓
    • Сложные метрики (YTD, YoY рост) работают с любыми срезами? ✓
    • Обработаны деления на ноль и BLANK значения? ✓
    • Модель открывается за меньше 30 секунд? ✓

    Если на все вопросы ответ "да" — ваша финансовая модель готова к бою. Она переживет смену версий Power BI, миграцию источника данных и даже самых придирчивых аудиторов.

    И последний совет: не закапывайтесь в детали на месяцы. Сделайте минимально рабочую версию. Покажите стейкхолдерам. Получите обратную связь. Часто оказывается, что их "критически важный" отчет нужен раз в квартал, а вовсе не в реальном времени. Экономьте свое время на том, что действительно важно. Как показывают исследования, 95% компаний не видят отдачи от сложных аналитических систем именно потому, что строят их без понимания реальных потребностей бизнеса.

    Сначала дайте людям простые, но точные цифры. Потом добавляйте сложную аналитику. И никогда, слышите, никогда не делайте дашборды, от которых у пользователей начинается "анализальный паралич". Одна четкая таблица фактов, три ключевых измерения, пять понятных метрик — часто этого достаточно, чтобы принимать решения на миллионы.