Как сверить два SQL-отчёта: одинаковые суммы могут скрывать ошибки

После переноса отчёта итоговая сумма совпала, и проверку решили завершить. Но одна операция могла исчезнуть, а другая удвоиться на ту же сумму. Сверка только общего итога не доказывает эквивалентность наборов.

Как разобрать ситуацию

Сначала выровняйте детализацию и единицы измерения. Затем соберите множество ключей обоих результатов, присоедините версии и найдите отсутствующие строки или отличающиеся показатели. Пример использует UNION для уникального перечня ключей, а не для объединения финансовых фактов. Это осмысленное применение удаления дублей.

Пример и ожидаемый результат

В отчёте A ключи 1 и 2 имеют суммы 100 и 50. В B ключи 1 и 3 имеют те же суммы. Общий итог везде 150, но различия должны показать исчезнувший ключ 2 и появившийся ключ 3.

WITH a(id,x) AS(VALUES(1,100),(2,50)), b(id,x) AS(VALUES(1,100),(3,50)), keys AS(
SELECT id 
FROM a UNION 
SELECT id 
FROM b) 
SELECT k.id,a.x,b.x 
FROM keys k 
LEFT JOIN a ON a.id=k.id 
LEFT JOIN b ON b.id=k.id 
WHERE a.x IS NOT b.x 
ORDER BY k.id;

Ответ содержит ключ 2 со значениями 50 и NULL и ключ 3 со значениями NULL и 50. Суммарная сверка их бы не заметила.

Проверка перед применением

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

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

Границы решения

Если NULL является допустимым значением показателя, проверяйте присутствие строки по непустому ключу, а не по самой сумме. В примере ключ обязателен и уникален.

Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе

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

Техническая справка: www.sqlite.org: документация.

Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Как разбить события на сессии в SQL по паузе между действиями, UNION или UNION ALL: как случайно потерять одинаковые платежи.