Две корзины с одинаковой суммой: как сравнить состав товаров в SQL
Корзина на сайте и корзина в системе заказов имеют одинаковый итог, но покупатель получил другой товар. Совпадение денежной суммы не доказывает совпадение состава. Для сверки нужны артикул и количество каждой позиции после нормализации строк.
Как разобрать ситуацию
Сначала объедините повторные строки одного артикула внутри каждой корзины. Затем соберите множество артикулов обеих версий и сравните количества. Отсутствующий артикул трактуется как ноль только в контексте известной полной корзины. Цена и скидка проверяются отдельным контролем: здесь исследуется именно состав.
Пример и ожидаемый результат
В первой версии A имеет количество 2, B — 1. Во второй A представлен двумя строками по 1, B — 2. После агрегации A совпадает, а B отличается: 1 против 2. Сравнение числа строк ошибочно объявило бы различие также по A.
WITH a(sku,qty) AS(VALUES('A',2),('B',1)), b(sku,qty) AS(VALUES('A',1),('A',1),('B',2)), aa AS(
SELECT sku,SUM(qty) n
FROM a
GROUP BY sku), bb AS(
SELECT sku,SUM(qty) n
FROM b
GROUP BY sku), keys AS(
SELECT sku
FROM aa UNION
SELECT sku
FROM bb)
SELECT k.sku,COALESCE(aa.n,0),COALESCE(bb.n,0)
FROM keys k
LEFT JOIN aa ON aa.sku=k.sku
LEFT JOIN bb ON bb.sku=k.sku
WHERE COALESCE(aa.n,0)<>COALESCE(bb.n,0)
ORDER BY k.sku;Запрос возвращает только B с количествами 1 и 2. Повторные строки A корректно свёрнуты до одного сопоставимого факта.
Проверка перед применением
- Переставьте позиции местами: набор различий не должен измениться.
- Добавьте артикул только в одну версию и проверьте нулевое количество с другой стороны.
- Уточните единицы: упаковка из десяти штук не равна одной отдельной штуке без преобразования.
Для интеграции магазинов полезно сохранить список различий до преобразования артикула в название. Названия могут меняться и совпадать у разных товаров, тогда как согласованный SKU остаётся ключом. Если внешняя система использует собственные идентификаторы, сначала проверьте таблицу соответствия, иначе правильная арифметика сравнит разные сущности.
Границы решения
Сверка не определяет правильную сторону автоматически. Разные версии заказа могли относиться к разным моментам времени или содержать допустимое редактирование покупателем. Сначала сопоставьте идентификатор заказа и версию снимка.
Если запросы уже пишутся, а уверенности в кардинальности, оконных рамках и проверке результата не хватает, продолжить практику можно в нашем платном курсе
Продвинутый SQL: сложные запросы и задачи для собеседований. Перед записью сравните программу со своей задачей и подготовкой.
Техническая справка: www.sqlite.org: документация, www.sqlite.org: документация.
Следующий шаг: Сложные SQL-запросы: разборы расчётов и ошибок. По смежным вопросам: Топ товаров в SQL: три строки или три места с учётом ничьих, Как разбить события на сессии в SQL по паузе между действиями.
