@uroot

Как посчитать сумму значений value в колонках с одинаковым id?

У меня есть наполовину правильный запрос:
SELECT o.id, o.variant_id, vp.variant_id, vp.quantity AS quantity_result
FROM orders AS o
LEFT JOIN variant_products AS vp ON vp.variant_id = o.variant_id
LEFT JOIN products AS p ON p.id = vp.product_id
LEFT JOIN product_types AS pt ON pt.id = p.type_id
WHERE pt.id NOT IN (1, 2);

Результат его работы на скрине:
Модератор: результат в текстовом виде не выводится?
в таблице variant_products может быть несколько записей с одинаковым variant_id. нужно сложить сумму vp.quantity записей с одинаковым variant_id.
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
@alexalexes
Проверьте этот вариант:
SELECT o.id, o.variant_id, 
            /* vp.variant_id,  */ -- заджойненные id дублировать в выборке не нужно, если, конечно, не хотите наблюдать null-значения по другую сторону присоединения таблицы vp
              vp.quantity AS quantity_result,
            sum(vp.quantity) over (partition by vp.variant_id) as sum_by_variant_id -- сумма в пределах партиции variant_id
FROM orders AS o
LEFT JOIN variant_products AS vp ON vp.variant_id = o.variant_id
LEFT JOIN products AS p ON p.id = vp.product_id
LEFT JOIN product_types AS pt ON pt.id = p.type_id
/*WHERE */                               and pt.id NOT IN (1, 2) -- если напишите в where, то выборка усечется до такого условия с pt.id. Но если напишите это условие в left join, то выберутся все Order, но где pt.id IN (1, 2) будут null значения.

Но скорее всего вот такой вариант пойдет:
SELECT o.id, o.variant_id, 
            /* vp.variant_id,  */ -- заджойненные id дублировать в выборке не нужно, если, конечно, не хотите наблюдать null-значения по другую сторону присоединения таблицы vp
            sum(vp.quantity) as sum_by_variant_id -- сумма в пределах группировки o.id, o.variant_id 
FROM orders AS o
LEFT JOIN variant_products AS vp ON vp.variant_id = o.variant_id
LEFT JOIN products AS p ON p.id = vp.product_id
LEFT JOIN product_types AS pt ON pt.id = p.type_id
/*WHERE */                               and pt.id NOT IN (1, 2) -- если напишите в where, то выборка усечется до такого условия с pt.id. Но если напишите это условие в left join, то выберутся все Order, но где pt.id IN (1, 2) будут null значения.
group by o.id, o.variant_id /*, vp.variant_id  */

PS: Вы уверены в применении left join? Не просто join?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы