SQL на практике: находим ошибки в данных и расчётах

Бесплатный практический курс по SQL для аналитиков, QA и разработчиков. На учебной базе SQLite вы разберёте JOIN, агрегаты и ошибки учёта платежей: лишние строки, пропущенные заказы и повторные транзакции. Самостоятельно исправите SQL-отчёт, сверите суммы товаров и оплат и проверите результат на семи наборах данных.…
Начальный уровень
4–5 часов в неделю

Чему вы научитесь

  • Запускать локальную учебную базу SQLite и выполнять SQL-запросы к данным интернет-магазина
  • Определять ключи, связи и уровень детализации строк в таблицах пользователей, заказов, товарных позиций, платежей и доставок
  • Рассчитывать стоимость товаров в заказе по количеству и цене каждой позиции
  • Сравнивать INNER JOIN и LEFT JOIN и сохранять в выборке заказы без платежей или других связанных записей
  • Находить размножение строк при соединении заказов с несколькими позициями и доставками
  • Различать COUNT(*) и COUNT(DISTINCT order_id) при подсчёте строк и уникальных заказов
  • Объяснять, почему SUM(DISTINCT ...) теряет корректные суммы одинаковых по стоимости позиций
  • Использовать GROUP BY для расчёта агрегатов и получать ровно одну строку на заказ
  • Различать отсутствие платежа и нулевую сумму, корректно применять NULL и COALESCE в отчётах
  • Считать только успешные платежи, исключая ожидающие и неуспешные попытки оплаты
  • Находить неоплаченные и частично оплаченные заказы и рассчитывать разницу между стоимостью товаров и суммой платежей
  • Использовать CTE и подзапросы для независимой агрегации товарных позиций и платежей до соединения результатов
  • Применять EXISTS для проверки наличия связанных записей без увеличения числа строк
  • Обнаруживать повторный импорт одного платежа по идентификатору транзакции в пределах заказа
  • Учитывать разные успешные транзакции с одинаковой суммой, не удаляя их как дубликаты
  • Проверять, что дополнительные доставки и неуспешные платежи не изменяют итоговые денежные показатели
  • Сверять значения по каждому заказу и общие суммы отчёта с независимыми запросами к исходным таблицам
  • Проверять SQL-расчёты на изменённых данных, включая новые позиции, другую стоимость заказа и повторные записи
  • Самостоятельно находить несколько причин неверных расчётов в готовом SQL-отчёте и исправлять их
  • Создавать итоговый отчёт с одной строкой на заказ, корректными суммами и проверкой на семи наборах данных

О курсе

SQL и качество данных: Ошибки JOIN, агрегатов и платежей в SQL-отчётах

🧭 Отправная точка

У заказа 104 две товарные позиции стоимостью 6000 и 1500 копеек. Вместе они стоят 7500 копеек. После соединения с таблицей доставок запрос может вернуть четыре строки: у заказа две доставки, и каждая позиция повторяется дважды. Обычный SUM в таком результате покажет 15 000 копеек.

SUM(DISTINCT ...) тоже не исправит расчёт. У заказа 107 две разные позиции по 750 копеек. Этот агрегат сложит только одно из одинаковых значений и покажет 750 вместо 1500. Чтобы правильно считать суммы, нужно понимать, какие записи представляют отдельные товары, платежи и заказы.

На курсе вы будете находить подобные ошибки в учебной базе интернет-магазина на SQLite. В ней есть пользователи, заказы, товарные позиции, платежи и доставки. Вы разберётесь, как соединения увеличивают число строк, почему из отчёта исчезают неоплаченные заказы и как отличать повторную запись платежа от новой транзакции.

🎯 Цель курса — научиться находить ошибки в SQL-отчётах, исправлять расчёты и независимо проверять суммы товаров и успешных платежей.

⚙️ Что вы будете делать

Начнёте с пяти таблиц магазина: изучите ключи и связи, рассчитаете стоимость товаров, сравните INNER JOIN и LEFT JOIN. Проследите, откуда берутся дополнительные строки после соединений, и проверите разницу между COUNT(*) и COUNT(DISTINCT order_id). Научитесь получать по одной строке для каждого заказа, сохраняя в отчёте и неоплаченные заказы.

Затем разберёте учёт платежей. Будете суммировать успешные транзакции, отделять их от ожидающих и неуспешных, работать с NULL и COALESCE. Проверите, как распознать повторный импорт по паре (order_id, transaction_ref), почему разные платежи равной суммы нужно учитывать отдельно и как находить противоречивые суммы у записей одной транзакции.

С помощью GROUP BY, CTE и подзапросов соберёте отчёт, где стоимость товаров и оплата рассчитываются отдельно, а готовые суммы присоединяются к заказам. Проверите, что дополнительная доставка не меняет денежные показатели, неуспешный платёж не увеличивает оплаченную сумму, а изменение количества товара отражается в стоимости заказа.

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

🔥 Чем отличается курс

Все примеры выполняются на небольшой локальной базе SQLite. Вы будете смотреть на исходные строки и результаты соединений, проверять количество позиций, доставок и платежей. Для каждой неверной суммы можно проследить, какие именно записи попали в расчёт.

У платежей есть отдельные правила учёта. Повторные успешные записи одной транзакции считаются один раз по её идентификатору в пределах заказа. Две разные транзакции с одинаковой суммой учитываются обе. Если записи одной транзакции противоречат друг другу по сумме, сначала потребуется обнаружить ошибку в данных.

Итоговый SQL-отчёт содержит идентификатор и статус заказа, стоимость его товаров, сумму успешных платежей и разницу. Заказы без оплаты остаются в отчёте, а заказ без позиций показывает нулевую стоимость товаров. Если оплата превышает стоимость, разница будет отрицательной. Вы проверите как отдельные заказы, так и общие итоги: совпавшая общая сумма ещё не гарантирует правильность каждой строки.

Локальный скрипт проверит ваш SQL на семи независимых наборах данных: исходном и шести изменённых. Среди изменений — новая доставка, повторный импорт платежа, неуспешная попытка оплаты, другое количество товара, дополнительная позиция той же стоимости и заказ без позиций. Проверяются состав и уникальность заказов, пять полей отчёта и суммы по каждому заказу.

📚 Дополнительные бесплатные материалы

📦 Учебные файлы и время

Курс бесплатный: 5 модулей, 24 урока, ориентировочно 7–10 часов с практикой. Вы получите учебную базу SQLite и файлы для самостоятельных SQL-заданий. Для работы достаточно Python 3.12 или новее, редактора и терминала; Docker и серверная база данных не понадобятся.

Готовые запросы проверяются локально. Аккаунт GitHub, форк, публикация решений и ручная рецензия для прохождения не требуются.

🧪 Поддержка

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

Индивидуальная проверка работ преподавателем и персональные консультации в этом курсе не предусмотрены. Формат рассчитан на самостоятельное прохождение.

🚀 О XNova

XNova — практические курсы и учебные проекты для разработчиков, тестировщиков и инженеров. Мы разбираем технологии на работающих примерах: с кодом, наблюдаемым результатом и объяснением инженерных решений.

🔗 xnova.dev — другие курсы и материалы XNova.

📬 Контакты и сообщество

Продолжить знакомство с XNova, следить за новыми материалами или задать организационный вопрос можно здесь:

  • 📣 Telegram-канал: @xnova_dev — анонсы курсов, статьи и новости проекта.
  • 💬 Написать XNova: @xnova_contact — контакт для вопросов о курсах и проекте.
  • ✉️ Почта: contact@xnova.dev — если удобнее написать письмом.
  • 💻 GitHub: xnova-tech — открытые учебные проекты и примеры.

Для кого этот курс

— Начинающие аналитики данных и продуктовые аналитики, которые уже умеют писать простые SELECT-запросы и хотят научиться находить ошибки в отчётах, считать суммы по правильным исходным записям и проверять результат самостоятельно. — Бизнес-аналитики, которые работают с заказами, оплатами и показателями продукта и хотят понимать, почему SQL-отчёты могут расходиться с исходными данными и как проверить правила расчёта. — QA/AQA-инженеры, которым нужно проверять данные в базе, искать потерянные и повторные записи и писать SQL-проверки для отчётов и бизнес-операций. — Начинающие Backend-разработчики, которые используют SQL в приложениях и хотят разобраться, как соединения таблиц, отсутствующие связанные записи и повторные платежи влияют на агрегаты.

Начальные требования

📚 Начальные знания

  • Уметь выполнять базовый SELECT, выбирать столбцы, использовать WHERE и читать таблицу результата.
  • Понимать, что такое строка, столбец и идентификатор записи.
  • Уметь открыть терминал и запустить команду. JOIN, CTE и агрегаты разбираются в курсе.

🧰 Окружение

  • Python 3.12 или новее со встроенным модулем sqlite3. Установка серверной базы не требуется.
  • Редактор для SQL-файлов и терминал на Windows, macOS или Linux.
  • Git полезен, но необязателен: учебный архив можно скачать без аккаунта GitHub.
  • После подготовки стенда все проверки должны работать локально и без интернета.

⏱️ Время и формат

Курс бесплатный. Ориентир — 7–10 часов с самостоятельными заданиями. Ответы на вопросы проверяются автоматически; собственные SQL-файлы проверяет локальный скрипт, без ручной рецензии.

✅ Что не потребуется

Docker, облачная база, платные сервисы, API-ключи, доступ к реальным заказам или обязательный форк GitHub.

Как проходит обучение

🧮 От исходных строк к проверенному отчёту. На одной локальной базе SQLite вы постепенно разбираете JOIN, агрегаты и причины неверных сумм.

  • 🔎 Исследуете данные: проверяете, где появляются лишние строки и почему пропадают неоплаченные заказы.
  • 🛠️ Пишете свои запросы: исправляете расчёты и небольшой аналитический отчёт.
  • ✅ Сверяете итог: сравниваете суммы с исходными таблицами и запускаете локальную автоматическую проверку.

Программа курса

В курс входят

  • 25 уроков
  • 40минут видео
  • 24 теста
загружаем...

Наши преподаватели

Что вы получаете

  • Локальная учебная база SQLite с синтетическими пользователями, заказами, товарными позициями, платежами и доставками
  • Собственные SQL-запросы для расчёта стоимости заказов, сравнения INNER JOIN и LEFT JOIN и обнаружения размножения строк
  • Запросы с GROUP BY, CTE, подзапросами и EXISTS для расчётов без повторного учёта записей
  • Проверки успешных, неуспешных и отсутствующих платежей, повторных импортов и частично оплаченных заказов
  • Независимые SQL-сверки сумм товаров и платежей по каждому заказу и по всей выборке
  • Исправленный итоговый запрос queries/final_report.sql с идентификатором и статусом заказа, стоимостью товаров, суммой успешных платежей и разницей
  • Результаты локальной автоматической проверки отчёта на семи наборах данных, включая случаи с повторными платежами, новыми доставками и изменёнными позициями

Сколько стоит обучение

Бесплатно

Расскажите о курсе друзьям

Бесплатно