Как сверить два 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: как случайно потерять одинаковые платежи.
