Календарь продаж в Power Query: дни без продаж и пропущенные данные
Как создать непрерывный календарь в Power Query, присоединить продажи по датам и отличить подтверждённый ноль от отсутствующей выгрузки на учебном примере.
Содержание статьи
Коротко о главном
Чтобы показать дни без продаж, создайте календарь всех дат нужного периода и присоедините к нему дневные итоги левым внешним соединением. Отсутствующее совпадение сначала оставьте как null. Ставьте ноль только после подтверждения полноты данных за день: отсутствие строки продажи и отсутствие самой выгрузки требуют разных решений.
- Календарь строят по границам отчётного периода, а не только между первой и последней продажей.
- Null после соединения означает отсутствие найденного значения; он не подтверждает день без продаж.
- Для каждого дня отдельно храните сумму и статус полноты источника.
- Дневная таблица должна содержать одну строку на дату в выбранном кабинете и срезе.
1. Определите, какой день и какой показатель считаете
Выгрузка операций обычно показывает события. Если в конкретную дату нет строк, график может перескочить к следующей продаже. Для ежедневного контроля нужна другая основа: одна строка на каждый день отчётного периода, даже если события отсутствуют. Эта основа и есть календарь.
Ниже рассматривается один кабинет, один согласованный показатель суммы продаж в рублях и период с 1 по 5 октября 2026 года включительно. Возвраты, отмены и служебные итоги в учебный набор не входят. Это условные данные редакции, а не схема конкретного экспорта WB или Ozon. Выберите в своём источнике дату нужного события: дата заказа и дата продажи отвечают на разные вопросы.
Если источник содержит время, сначала согласуйте часовой пояс отчёта и только затем выделяйте календарную дату. Иначе операция около полуночи может попасть в соседний день. В примере даты уже подготовлены, денежные значения проверены, ошибки преобразования и повторная загрузка операций исключены.
2. Создайте полный список дат
В редакторе Power Query создайте пустой запрос. В строке формул введите: = List.Dates(#date(2026, 10, 1), 5, #duration(1, 0, 0, 0)). Microsoft определяет аргументы как начальную дату, количество значений и шаг. Здесь получится пять дат с шагом в один день: от 1 до 5 октября.
Преобразуйте список командой «В таблицу» / To Table, оставив значения без разделения, переименуйте единственный столбец в «Дата» и задайте тип «Дата». Назовите запрос «Календарь». Для программного преобразования списка Microsoft документирует Table.FromList; в этой инструкции достаточно команды редактора.
Проверьте первую дату, последнюю дату, пять строк и отсутствие повторов. Для другого включительного периода количество дней равно разнице конечной и начальной дат плюс один. Не берите границы только из найденных продаж: тогда первые или последние дни без операций вообще не попадут в проверку. Начало позже конца — ошибка параметров, которую нужно исправить до создания списка.
3. Подготовьте дневные итоги и отдельный реестр полноты
Сохраните запрос исходных операций, а для соединения подготовьте дневную таблицу: «Дата», «Сумма», «Строк операций». Сгруппируйте проверенные операции по дате, сложите суммы и посчитайте строки. Число строк не называйте количеством заказов, если источник содержит товарные позиции или несколько событий одного заказа.
На каждую дату должна приходиться не более одной строки дневного итога. Если анализируете несколько кабинетов или SKU, одного поля «Дата» недостаточно: нужны ожидаемые комбинации даты и соответствующих ключей. Простое соединение календаря с многими товарами по одной дате не создаёт корректный календарь каждого товара.
Отдельно заведите реестр: «Дата», «Полнота», «Основание проверки». Статус «Подтверждена» ставьте после проверки периода, кабинета, состава файлов, завершённости выгрузки и доступных независимых контрольных итогов. Наличие хотя бы одной продажи не доказывает полноту дня. Пустой файл тоже сначала проверяют: он может быть корректным отчётом без событий или результатом неправильного фильтра.
4. Присоедините продажи к календарю
В запросе «Календарь» выберите «Главная → Объединить запросы». Слева оставьте календарь, справа укажите дневные итоги. Выберите «Дата» в обеих таблицах и Left outer / левое внешнее соединение. Microsoft описывает его как сохранение всех строк слева с добавлением совпадений справа. Поэтому день без найденного итога останется в результате.
Раскройте из добавленного столбца сумму и число исходных операций. Проверьте, что календарь по-прежнему содержит пять строк, а суммы найденных дней сохранились. Если строк стало больше, справа осталось несколько соответствий на одну дату: вернитесь к уровню детализации дневной таблицы.
Таким же соединением добавьте реестр полноты, заранее проверив его уникальность по дате. Типы ключевых столбцов должны совпадать — это прямо указано в Merge queries overview. Текст «01.10.2026» и значение типа «Дата» не следует считать готовой парой ключей. Не используйте внутреннее соединение: оно оставит только совпадения и снова спрячет отсутствующие дни.
5. Разделите подтверждённый ноль и неизвестный результат
В языке M значение null обозначает отсутствие либо неизвестность значения. После раскрытия соединения оно появляется и для даты, которой нет в дневной таблице. Это технический результат поиска соответствия, а не заключение о спросе на товар.
Сохраните исходную сумму и добавьте отдельные поля «Статус дня» и «Сумма для полного дневного итога». Правило ниже предполагает, что все суммы найденных операций известны. Если исходная операция сама содержит null или Error, сначала разберите её; это не день без событий.
- Полнота подтверждена, дневной итог найден: статус «Данные проверены», используйте найденную сумму.
- Полнота подтверждена, операций нет: статус «Нет продаж», в расчётном поле допустим 0.
- Полнота не подтверждена: статус «Неполные данные», полный дневной итог остаётся null даже при наличии части операций.
- Записи в реестре нет: статус «Полнота неизвестна»; не превращайте отсутствие проверки в подтверждение нуля.
6. Проверьте пять учебных дней
Пусть в дневных итогах есть только три даты: 1 октября — 1 200 ₽, 3 октября — 800 ₽, 5 октября — 500 ₽. По реестру 1, 2, 3 и 5 октября полностью проверены. За 4 октября выгрузка отсутствует. После соединения суммы 2 и 4 октября выглядят одинаково: null. Однако основание для нуля есть только у 2 октября.
Известная сумма равна 1 200 + 0 + 800 + 500 = 2 500 ₽. Полный результат пяти дней пока неизвестен. Среднее по четырём подтверждённым дням — 625 ₽ в день; это не среднее за весь период. Если без основания подставить ноль за 4 октября, получится 500 ₽ в день, но такой вывод опирается на выдуманное значение.
| Дата | Найденная сумма, ₽ | Полнота | Результат дня |
|---|---|---|---|
| 01.10 | 1 200 | Подтверждена | 1 200 ₽ |
| 02.10 | null | Подтверждена | Нет продаж: 0 ₽ |
| 03.10 | 800 | Подтверждена | 800 ₽ |
| 04.10 | null | Нет выгрузки | Неизвестно |
| 05.10 | 500 | Подтверждена | 500 ₽ |
7. Не заполняйте продажи соседним значением
Команда Fill down / «Заполнить вниз» переносит предыдущее непустое значение в последующие null. Microsoft описывает именно такое поведение. Она может быть уместна для восстановления повторяющейся подписи в исходной таблице, но не подтверждает сумму следующего дня. В учебном наборе так можно ошибочно перенести 1 200 ₽ на 2 октября.
Массовая замена всех null на нули скрывает отсутствие выгрузки. Удаление строк с null скрывает дни из календаря. Обе операции лишают отчёт контрольного сигнала. Сохраняйте статус рядом с показателем и проверьте, как ваш график отображает неизвестные значения: пропуск не должен выглядеть как подтверждённое отсутствие продаж.
Даже достоверный ноль в денежном нетто-показателе не означает отсутствие событий: продажи и возвраты могли взаимно компенсироваться. Для такого отчёта отдельно показывайте типы операций и их количество. В текущем учебном примере возвратов нет, поэтому это допущение не влияет на расчёт.
8. Примите обновление по датам и статусам
Для примера ожидаются пять уникальных дат, четыре подтверждённых дня, один подтверждённый день без продаж и один день с неполными данными. Сумма найденных значений до и после соединения должна остаться 2 500 ₽. Такой контроль одновременно проверяет непрерывность календаря и сохранность уже известных сумм.
После получения выгрузки за 4 октября пересчитайте дневные итоги и измените его статус только после проверки источника. Допустим, подтверждена сумма 700 ₽. Тогда полный итог периода — 3 200 ₽, все пять дней подтверждены, среднее — 640 ₽ в день. Это продолжение учебного расчёта, а не прогноз продаж.
Сохраняйте время обновления и нерешённые дни рядом с отчётом. После проверки данных можно перейти к выбору отклонений для разбора в разделе HelpStat «Рука на пульсе». Создание календаря и оценка полноты в этой инструкции выполняются в Power Query; автоматическая загрузка такой таблицы в HelpStat здесь не предполагается.
Источники и методика
Источники ниже помогают проверить определения и возможности отчётов. Методика разбора и учебные расчёты подготовлены редакцией HelpStat. Доступность отчётов и условия работы проверяйте в своём кабинете. Расчётные примеры в статье — учебные, а не результаты клиентов.
Как устроены материалы HelpStat
- Microsoft Learn: List.Dates — начало, число дат и шаг
- Microsoft Learn: Table.FromList — преобразование списка в таблицу
- Microsoft Learn: Merge queries — ключи и типы соединений
- Microsoft Learn: Left outer join и null при отсутствии совпадения
- Microsoft Learn: значение null в языке M
- Microsoft Learn: Fill down и Fill up
Материал отражает сведения на указанную дату. Правила и условия работы площадок могут измениться. Редакционные принципы