2015-10-24 4 views
2

Почему MySQL полное внешнее соединение возвращает нули?Почему MySQL полное внешнее соединение возвращает нули?

Привет

У меня есть следующие данные:

s_id,date,p_id,amount_sold 
1, '2015-10-01', 1, 10 
2, '2015-10-01', 2, 12 
7, '2015-10-01', 1, 11 
3, '2015-10-02', 1, 11 
4, '2015-10-02', 2, 10 
5, '2015-10-15', 1, 22 
6, '2015-10-16', 2, 20 
8, '2015-10-22', 3, 444 

и я хочу, чтобы мой запрос на вывод что-то вроде этого: (A = сумма AMOUNT_SOLD для p_id = 1 для этой даты, B = сумма из AMOUNT_SOLD для p_id = 2 для этой даты)

date,A,B,Difference 
'2015-10-01',21,12,9 
'2015-10-02',11,10,1 
'2015-10-15',22,0,22 
'2015-10-01',0,20,-20 

Я пытался с этим запросом, но порядок его возвращения оказывает NULLS и выход неправильно:

SELECT A.p_id,A.date,sum(A.amount_sold) A,B.Bs, (sum(A.amount_sold) - B.Bs) as difference FROM sales as A 
LEFT JOIN (

SELECT SUM(amount_sold) Bs,p_id,s_id, DATE 
FROM sales 
WHERE p_id =2 
group by date 

) as B ON A.s_id = B.s_id 
where A.p_id=1 or B.p_id=2 
group by A.date, A.p_id 

UNION 

SELECT A.p_id,A.date,sum(A.amount_sold) A,B.Bs, (sum(A.amount_sold) - B.Bs) as difference FROM sales as A 
RIGHT JOIN (

SELECT SUM(amount_sold) Bs,p_id,s_id, DATE 
FROM sales 
WHERE p_id =2 
group by date 

) as B ON A.s_id = B.s_id 
where B.p_id=2 
group by A.date, A.p_id 

Он вернулся:

p_id date  A Bs difference 
1 2015-10-01 21 NULL NULL 
2 2015-10-01 12 12 0 
1 2015-10-02 11 NULL NULL 
2 2015-10-02 10 10 0 
1 2015-10-15 22 NULL NULL 
2 2015-10-16 20 20 0 

Что я делаю неправильно здесь? и как правильно это сделать? любая помощь будет оценена по достоинству.

ответ

3

Полное соединение не требуется. Вместо этого вы можете использовать условную агрегацию:

select 
    date, 
    sum(case when p_id = 1 then amount_sold else 0 end) a, 
    sum(case when p_id = 2 then amount_sold else 0 end) b, 
    sum(case when p_id = 1 then amount_sold else 0 end) 
    - sum(case when p_id = 2 then amount_sold else 0 end) difference 
from sales 
where p_id in (1,2) 
group by date 
+0

Спасибо, это работает. –

Смежные вопросы