Таблица дат (Date Dimension)

Создаём отдельную таблицу-календарь — без неё не работает аналитика по периодам.

Таблица дат — справочник со сплошным календарём (по строке на каждый день), к которому привязываются факты для расчётов по времени.

Зачем нужна отдельная таблица дат

Почти любой бизнес-отчёт смотрит на время: продажи по месяцам, рост год к году, накопительный итог. Все эти расчёты (time intelligence в DAX) требуют специальной таблицы дат. Использовать столбец даты прямо из фактов нельзя по двум причинам: в фактах есть пропуски (дни без продаж выпадут из оси), и в фактах нет удобных атрибутов вроде «название месяца» или «квартал».

Каким должен быть календарь

Правильная таблица дат обязана быть непрерывной: ни одного пропущенного дня от первой до последней даты периода. Тогда на графике февраль не «схлопнется» из-за дня без заказов. Помимо самой даты, в неё добавляют производные столбцы для разрезов:

СтолбецПримерЗачем
Дата2026-06-22ключ связи
Год2026фильтр/ось по годам
Номер месяца6сортировка месяцев
Название месяцаИюньчитабельная ось
КварталQ2квартальные отчёты
День неделиПонедельниканализ по дням

Как создать

Таблицу дат генерируют формулой DAX (например, функцией CALENDAR, задающей диапазон от минимальной до максимальной даты) или собирают в Power Query. Затем добавляют столбцы года/месяца/квартала. Ниже — учебный пример заполнения диапазона дат на чистом Python, чтобы прочувствовать логику «строка на каждый день»:

from datetime import date, timedelta

start = date(2026, 1, 1)
end = date(2026, 1, 7)
d = start
while d <= end:
    print(d.isoformat(), "| год:", d.year, "| месяц:", d.month)
    d += timedelta(days=1)

Вывод:

2026-01-01 | год: 2026 | месяц: 1
2026-01-02 | год: 2026 | месяц: 1
2026-01-03 | год: 2026 | месяц: 1
2026-01-04 | год: 2026 | месяц: 1
2026-01-05 | год: 2026 | месяц: 1
2026-01-06 | год: 2026 | месяц: 1
2026-01-07 | год: 2026 | месяц: 1

Пометить и связать

Готовую таблицу нужно пометить как таблицу дат (Mark as Date Table) — так Power BI поймёт, что это календарь, и функции time intelligence заработают корректно. Затем создаётся связь «один-ко-многим»: Date[Дата]Sales[order_date]. Часто полезный приём — сортировка по столбцу: чтобы «Июнь» стоял после «Мая», а не по алфавиту, столбец «Название месяца» сортируют по «Номеру месяца».

Как работает под капотом

Функции вроде TOTALYTD внутри строят набор дат от начала года до текущей и применяют его как фильтр к фактам через связь с таблицей дат. Если календарь дырявый или таблица не помечена, движок не может корректно сформировать эти диапазоны — расчёты по периодам ломаются или дают неверные суммы.

Частые ошибки

  • Использовать дату из фактов вместо отдельной таблицы. Пропуски дней и нехватка атрибутов ломают аналитику по времени.
  • Дырявый календарь. Любой пропущенный день искажает периоды и накопительные итоги.
  • Месяцы по алфавиту. Без «сортировки по столбцу» порядок месяцев на оси будет неверным.

Итог

  • Отдельная непрерывная таблица дат обязательна для time intelligence.
  • Добавьте столбцы года/месяца/квартала и пометьте таблицу как таблицу дат.
  • Свяжите её с фактами и настройте сортировку названий месяцев по номеру.
Проверьте себя
1. Почему нельзя обойтись датой прямо из таблицы фактов?
AДата из фактов не видна
BВ фактах есть пропуски дней и нет удобных атрибутов (месяц, квартал)
CPower BI не читает даты
DЭто быстрее
2. Что нужно сделать с готовой таблицей дат, чтобы корректно работал time intelligence?
AУдалить лишние столбцы
BПометить её как таблицу дат (Mark as Date Table) и связать с фактами
CСкрыть её из отчёта
DПеревести в текстовый тип