Объединить условия из двух таблиц

366
21 февраля 2017, 17:33

Есть запрос, в результате которого я получаю две строки(по каждому подзапросу).

select ifnull(null,'Russia'),from_sale from (
SELECT order_delivery_data.order_delivery_data_name,
round(sum(case `order`.order_status when 'paid' then 1 else 0 end)  /
sum(case `order`.order_status when 'delivered' then 1 else 0 end)) as from_sale
FROM order_delivery_data
INNER JOIN `order` ON order_delivery_data.order_id = `order`.order_id

where order_delivery_data.order_delivery_data_name in ('BetaPost','Pony Express')
and order_createdAt >= CURRENT_DATE - INTERVAL (7 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
and order_createdAt <= CURRENT_DATE - INTERVAL (0 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
UNION
select order_delivery_code,
round(sum(case `order`.order_status when 'paid' then 1 else 0 end)  /
sum(case `order`.order_status when 'delivered' then 1 else 0 end)) as from_sale
FROM order_delivery

INNER JOIN `order` ON order_delivery.order_id = `order`.order_id
and order_createdAt >= CURRENT_DATE - INTERVAL (7 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
and order_createdAt <= CURRENT_DATE - INTERVAL (0 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
AND order_delivery.order_delivery_code = 'courier'
 )X

Как избавиться от двух подзапросов и прописать условия в одном запросе? Что-то типа:

FROM order_delivery_data,order_delivery 
where order_delivery_data.order_delivery_data_name in ('BetaPost','Pony Express') 
or order_delivery.order_delivery_code = 'courier'

Просто сложить результаты двух запросов нельзя, так как данные имеют разный вес

Вот как выглядит запрос в оригинале

select ifnull(null,'Россия'),sum(from_sale) as from_sale from (
SELECT order_delivery_data.order_delivery_data_name,
round((sum(case `order`.order_status when 'paid' then 1 else 0 end)  +
sum(case `order`.order_status when 'delivered' then 1 else 0 end))/
(sum(case `order`.order_status when 'paid' then 1 else 0 end) +
sum(case `order`.order_status when 'later' then 1 else 0 end) +
sum(case `order`.order_status when 'delivery-approved' then 1 else 0 end)  +
sum(case `order`.order_status when 'problem' then 1 else 0 end)  +
sum(case `order`.order_status when 'refuse-to-send' then 1 else 0 end)  +
sum(case `order`.order_status when 'refuse-to-receive' then 1 else 0 end)  +
sum(case `order`.order_status when 'sent' then 1 else 0 end)  +
sum(case `order`.order_status when 'send' then 1 else 0 end)  +
sum(case `order`.order_status when 'parcel-returned' then 1 else 0 end)  +
sum(case `order`.order_status when 'stop' then 1 else 0 end)  +
sum(case `order`.order_status when 'parcel-on-a-place' then 1 else 0 end)  +
sum(case `order`.order_status when 'delivered' then 1 else 0 end)  +
sum(case `order`.order_status when 'injob' then 1 else 0 end)  +
sum(case `order`.order_status when 'fake' then 1 else 0 end)) * 100,2) as from_sale
FROM order_delivery_data
INNER JOIN `order` ON order_delivery_data.order_id = `order`.order_id
where order_delivery_data.order_delivery_data_name in ('BetaPost','Pony Express Россия','Доставка Почтой России',
'КСЭ','Москва BetaPro','СДЭК','СПСР')
and order_createdAt >= CURRENT_DATE - INTERVAL (7 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
and order_createdAt <= CURRENT_DATE - INTERVAL (0 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
UNION 
   select`delivery-types`.`delivery-types_name`,
round((sum(case `order`.order_status when 'paid' then 1 else 0 end)  +
sum(case `order`.order_status when 'delivered' then 1 else 0 end))/
(sum(case `order`.order_status when 'paid' then 1 else 0 end) +
sum(case `order`.order_status when 'later' then 1 else 0 end) +
sum(case `order`.order_status when 'delivery-approved' then 1 else 0 end)  +
sum(case `order`.order_status when 'problem' then 1 else 0 end)  +
sum(case `order`.order_status when 'refuse-to-send' then 1 else 0 end)  +
sum(case `order`.order_status when 'refuse-to-receive' then 1 else 0 end)  +
sum(case `order`.order_status when 'sent' then 1 else 0 end)  +
sum(case `order`.order_status when 'send' then 1 else 0 end)  +
sum(case `order`.order_status when 'parcel-returned' then 1 else 0 end)  +
sum(case `order`.order_status when 'stop' then 1 else 0 end)  +
sum(case `order`.order_status when 'parcel-on-a-place' then 1 else 0 end)  +
sum(case `order`.order_status when 'delivered' then 1 else 0 end)  +
sum(case `order`.order_status when 'injob' then 1 else 0 end)  +
sum(case `order`.order_status when 'fake' then 1 else 0 end)) * 100,2) as from_sale
FROM `delivery-types`
INNER JOIN order_delivery ON `delivery-types`.`delivery-types_code` = order_delivery.order_delivery_code
INNER JOIN `order` ON order_delivery.order_id = `order`.order_id
where order_delivery.order_delivery_code is not null
and order_createdAt >= CURRENT_DATE - INTERVAL (7 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
and order_createdAt <= CURRENT_DATE - INTERVAL (0 + (5 + DAYOFWEEK(CURRENT_DATE)) % 7) DAY
AND order_delivery.order_delivery_code = 'courier'
 )X

Но находить сумму двух значений некорректно sum(from_sale), т.к. не учитывается вес этих значений.

READ ALSO
Какие тип таблиц и формат строк выбрать?

Какие тип таблиц и формат строк выбрать?

Используется MySQL - 5,7-x64 Access -2016 odbc

323
reflection - Вызов метода с передачей массива

reflection - Вызов метода с передачей массива

Имеется класс вот в таком видеТоесть написать Foo или Bar с указанием импорта не получится, только так

396
Кнопка вверх android

Кнопка вверх android

Есть активность(активность 1), она запускает другую(активность 2), причем передает некие данные влияющие на то что отображает дочерняя активность(активность...

455