2016-12-29 6 views
0

У меня есть две таблицы, у которых нет отношений, и я делаю левое и правое соединение, чтобы имитировать полное соединение на них и выбрать некоторые данные.
способ отображения данных прав, но значения неправильные, его вид, как они выбраны более одного раза.
мои таблицы что-то вроде этого:
ТАБЛИЦА 1 (сделки)
trade_date ---- прибыльemulated of full join return wrong values ​​

ТАБЛИЦА 2 (general_cost)
дата ----- стоимость

это запрос что я написать:

select b.trade_date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0) 
from bargains as b 
left join general_cost as g on b.trade_date = g.date group by b.trade_date 
union 
select g.date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0) from 
bargains as b 
right join general_cost as g on b.trade_date = g.date group by g.date 

это результат запроса:

enter image description here

, например, в дате 1395-9-28 сумма столбца прибыли должна быть 440 и сумма колонки стоимости должна быть равна 800
, если это поможет вам следует знать, что есть три строки с этой датой в таблице сделок и две строки в таблице general_cost

ответ

1

Да, ваш запрос дублирует соответствующие записи, поскольку они включены как влево, так и в правое соединение. Вам нужно исключить соответствующие записи из одного из запросов. Я обычно исключают их из 2-го запроса союза:

select b.trade_date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0) 
from bargains as b 
left join general_cost as g on b.trade_date = g.date group by b.trade_date 
union 
select g.date, coalesce(sum(b.profit),0), coalesce(sum(g.cost),0) from 
bargains as b 
right join general_cost as g on b.trade_date = g.date 
where b.date is null //include only the records from general_cost that are not matched 
group by g.date 

UPDATE

Если у вас есть несколько записей в обеих таблицах с той же датой, то вам нужно сделать суммирующий за стол отдельно в подзапросов, в противном случае совпадающих записи действительно становятся дублируются:

select b.trade_date, b.profit, coalesce(g.cost,0) 
from (select trade_date, sum(profit) as profit from bargains group by trade_date) as b 
left join (select date, sum(cost) as cost from general_cost group by date) as g on b.trade_date = g.date 
union 
select g.date, 0, sum(g.cost) from //all profits has been summed up in the above query, so here we can use 0 in place of profit 
bargains as b 
right join general_cost as g on b.trade_date = g.date 
where b.trade_date is null //include only the records from general_cost that are not matched 
group by g.date 
+0

я использую где положение, но количество возвращаемых строк по запросу 9 я имею в виду его получить меньше, но все же я получаю тот же результат для этой даты, это значит, еще есть матч на обоих столах. Думаете, проблема в том, что я использую группу? – AliDK

+0

Ах, если бы «где» в неправильном месте, нужно опередить группу. Ответ обновлен. – Shadow

+0

Я знаю, что я делаю это правильно, я изменяю предложение where, но все же результат - это то, что я сказал. могу ли я отправить вам результат запроса, когда я удалю сумму из запроса, потому что, как вы сказали, это должно исключать нулевое значение, но нет нулевого значения, например, есть три копии одного и того же значения в столбце затрат для каждой даты в что я должен делать сейчас – AliDK