помогите исправить выборку которая считает сумму заказов с дублями при условии что есть аванс , есть выборка SELECT sum(order_cost_sum) as order_cost_sum FROM `crm_orders` LEFT JOIN crm_orders_prepay ON prepay_order_id = order_id WHERE order_add_date between '2018-10-02 00:00:00' and '2018-10-02 23:59:59' AND order_city =7 AND prepay_id is not null к примеру таблица заказов order_id order_cost_sum 1 100 2 150 3 200 таблица авансов prepay_id prepay_order_id prepay_summ 1 1 50 2 1 20 3 2 40 я ожидаю результат из примера 250 но мне дает 350 (100+100+150) так как дублирует заказ изза таблицы авансов , подскажите как исправить ?
@Evgenij85, сорь не рассмотрел структуру второй таблицы, позже напишу запрос. Как вариант навскидку вместо таблицы с авансами используйте вложенный запрос.
@Evgenij85, сделайте пожалуйста SQL дампы таблиц, абсолютно нет времени рисовать их руками. И еще смущает SUM без GROUP BY еще раз пальцем в небо, а вдруг прокатит)) SELECT sum(order_cost_sum) as order_cost_sum FROM `crm_orders` RIGHT JOIN crm_orders_prepay ON prepay_order_id = order_id WHERE order_add_date between '2018-10-02 00:00:00' and '2018-10-02 23:59:59' AND order_city =7 AND prepay_id is not null GROUP BY prepay_order_id
Пример вывода дубляжа: PHP: SELECT * FROM users WHERE login IN (SELECT login FROM users GROUP BY login HAVING COUNT(login)>1)
@MouseZver, вывод дублежа ТС не нужен, да и внешний запрос лишний SELECT * FROM users GROUP BY login HAVING COUNT(login)>1 сразу вернёт дубли хм... написал и сам засомневался... старость она такая)
@Evgenij85, да чтож с вам делать-то))) давайте всётаки дампы таблиц, а то у меня пальцев много я долго могу внебо тыкать)) --- Добавлено --- @MouseZver, виноват, поспешил, там конфликт полей будет жеж при * , так что да нужен внешний запрос, хотя я предпочитаю JOIN взамест IN
SELECT sum(order_cost_sum) as order_cost_sum FROM `crm_orders` where order_city =7 and order_add_date between '2018-10-02 00:00:00' and '2018-10-02 23:59:59' and order_id NOT IN ( SELECT order_id FROM `crm_orders` LEFT JOIN crm_orders_prepay ON prepay_order_id = order_id WHERE order_add_date between '2018-10-02 00:00:00' and '2018-10-02 23:59:59' AND prepay_id is not null GROUP BY order_id HAVING COUNT(order_id)> 1 ) при таком варианте удаляет дубли вместе с нормальным ID то есть дублированный ID вообще не учитывается
@Evgenij85, либо обратите внимание на exists, либо обрамите запрос из сообщения №6 ещё одним select для получения общей суммы. И можно оставить только join (не left и не right) с таблицей авансов и убрать сравнение "AND prepay_id is not null" за ненадобностью.
да согласен с JOIN тоже можно но все равно выводится не общая сумма а список сумм к примеру order_cost_sum 100 150
Перечитайте ещё раз внимательно 1. С join нужно без left и без right. 2. Проверку существования соответствующей записи в другой таблице можно выполнить без join, но с использованием соотнесенного подзапроса в выражении EXISTS (where exists (select 1 from other_table where...)) 3. select sum(order_cost_sum) as order_cost_sum from (select.. тут запрос из №6, с учетом пункта 1...); --- Добавлено --- В п.3 возможно надо будет псевдоним для подзапроса сообразить
@Valick, очевидно, ведь, что те, которые получаются в результате твоего запроса из сообщения #6. ТС ведь в #7 подтвердил, что числа правильные, не хватает только суммы
Да! Всё ещё проще. Однако... нужна сумма всех заказов, имеющим аванс. Всё. --- Добавлено --- Ну и пара условий по городу и дате размещения заказа (не аванса).
тьфу блин Код (Text): SELECT sum(order_cost_sum) as order_cost_sum FROM (SELECT DISTINCT prepay_order_id as order_id FROM `crm_orders_prepay` ) poi LEFT JOIN `crm_orders` USING (order_id) это как раз то о чём я говорил в посте №4, но потом почему-то забил себе голову, что надо суммы по авансам раскладывать P.S. я 17 раз просил у ТС дампы таблиц, терь пусть WHERE лепит сам куда хочет
Решение select sum(order_cost_sum)as order_cost_sum from#crm_orders where order_add_date between '2018-10-02 00:00:00'and'2018-10-02 23:59:59' and order_city =7 and exists ( select prepay_order_id from#crm_orders_prepay where prepay_order_id =#crm_orders.order_id ) ; есть еще одно решение select sum(order_cost_sum)as order_cost_sum from#crm_orders where order_add_date between '2018-10-02 00:00:00'and'2018-10-02 23:59:59' and order_city =7 and order_id in( select prepay_order_id from#crm_orders_prepay ) ;