# Какая позиция объясняет разницу в сумме **Чему учит:** перейти от расхождения суммы заказа к конкретному товару и проверить объяснение с точностью до копейки. Факультатив доступен после ступени 1. В DBeaver используйте пользователя `analyst` из [инструкции подключения](../../../README.md#подключиться-из-dbeaver). Дождитесь завершения `etl_pipeline`; оставьте `world_live` на паузе и дождитесь уже начатых прогонов. ## Найдите заказ В `dm.purchase_vs_orders_v` выберите один заказ с `mismatch_class = 'amount_delta'`. Возьмите закрытый день: `order_day` не позднее `max(snapshot_date) - 6` из `ods.order_v`. Сохраните `order_id`, `order_day`, `declared_revenue` и `items_total`. Найдите этот заказ в `dds.order_v`. Сопоставьте `items_total`, `discount`, `delivery` и `total`. Как связаны эти суммы? Объясните, почему клиентскую `declared_revenue` нужно сравнивать с `items_total`, чтобы искать разницу именно в составе корзины. ## Разберите позиции с двух сторон Найдите событие покупки в `ods.event_v`: `purchaseID[1]` совпадает с номером заказа, `EventDate` — с выбранным днем, `EventType = 'purchase'`. Откройте поле `ecommerce`. Внутри JSON массив `purchase.products` содержит позиции клиента с полями `id`, `price` и `quantity`. Разверните этот массив в строки и получите артикул, точную цену, количество и стоимость каждой позиции. Для разбора пригодятся `JSONExtractArrayRaw` и `JSONExtract`, для разворачивания массива — `ARRAY JOIN`. Деньги извлекайте как `Decimal` с двумя знаками после запятой. С другой стороны используйте массивы `item_sku`, `item_price` и `item_quantity` заказа в `dds.order_v`. Элементы с одним индексом относятся к одной позиции; при разворачивании сохраняйте эту связь. Сопоставьте позиции по артикулу так, чтобы остались видны товары, присутствующие только с одной стороны. Покажите, какие позиции совпали, а какая объясняет разницу. В результате нужны строки товаров, а не только две итоговые суммы. ## Проверьте объяснение Подтвердите три равенства: - сумма стоимостей клиентских позиций равна `declared_revenue`; - сумма стоимостей позиций магазина равна `items_total`; - стоимость отсутствующей у магазина позиции равна `declared_revenue - items_total`. Затем сравните точные цены из JSON с готовым массивом `productPrice` события. По [формату выгрузки](../../formats/clickstream-event.md) цены в нем округлены до целых рублей. Покажите на своей корзине, что потеряется при расчете по этому массиву. Если все цены выбранной корзины целые, возьмите еще один заказ с расхождением и дробной ценой. В коротком объяснении назовите заказ, товар, количество, цену и разницу. Отделите то, что подтверждают данные, от причины, которую по ним установить нельзя: отсутствие позиции в заказе видно, а причину ее удаления источник отдельным полем не сообщает. ## Что должно получиться - [ ] позиции клиента и магазина сопоставлены по артикулам; - [ ] все три равенства сходятся до копейки; - [ ] найден пример потери точности в готовом массиве цен; - [ ] расхождение объяснено конкретной позицией, а скидка и доставка отделены от сравнения корзин.