# Какая позиция объясняет разницу в сумме **Чему учит:** перейти от расхождения суммы заказа к конкретному товару и проверить объяснение с точностью до копейки. Факультатив доступен после ступени 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`, если мы ищем расхождение именно в составе корзины? Проверьте свой выбор после разбора позиций. ## Разберите позиции с двух сторон Найдите событие покупки в `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` события. Пересчитайте стоимость клиентской корзины по этому массиву: сойдется ли она с `declared_revenue` до копейки? Найдите цены, на которых результаты различаются, и сверьте наблюдение с [форматом выгрузки](../../formats/clickstream-event.md). Если все цены выбранной корзины целые, возьмите еще один заказ с расхождением и дробной ценой. В коротком объяснении назовите заказ, товар, количество, цену и разницу. Какие строки подтверждают найденное расхождение? Есть ли в источниках сведения о том, почему оно возникло? Отделите наблюдения от предположений. ## Что должно получиться - [ ] позиции клиента и магазина сопоставлены по артикулам; - [ ] все три равенства сходятся до копейки; - [ ] найден пример потери точности в готовом массиве цен; - [ ] расхождение объяснено конкретной позицией, а скидка и доставка отделены от сравнения корзин.