# Какая позиция объясняет разницу в сумме Вы сравните товары в событии покупки и заказе магазина, чтобы найти причину разницы в суммах. При разборе вложенных данных понадобится сохранить точность цен до копейки. Факультатив доступен после ступени 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). Если все цены выбранной корзины целые, возьмите еще один заказ с расхождением и дробной ценой. Какие строки подтверждают найденное расхождение? Есть ли в источниках сведения о том, почему оно возникло? Отделите наблюдения от предположений. ## Поля для точного расчета Укажите рядом с запросом, откуда брать цену, каким типом ее читать и по какому ключу сопоставлять позиции. Подтвердите выбор результатами обеих сверок: суммы разобранных позиций с суммой своего источника и позиций двух источников между собой. Какой результат укажет на ошибку вашего разбора, а какой потребует искать причину выше — в данных, которые получил запрос? ## Результат работы - [ ] сохранен запрос сверки позиций, не теряющий товары без пары; - [ ] все три равенства сходятся до копейки; - [ ] найден пример потери точности в готовом массиве цен; - [ ] выбор полей, типа денег и ключа сопоставления подтвержден расчетами; - [ ] расхождение источников сверки отделено от ошибки своего разбора и различия между стоимостью корзины и итогом со скидкой и доставкой.