为什么MySQL全外连接返回空值?

时间:2015-10-24 23:22:37

标签: mysql sql join

为什么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 =该日期p_id = 1的amount_sold之和,B =该日期p_id = 2的amount_sold之和)

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

我在这里做错了什么?这样做的正确方法是什么?任何帮助将不胜感激。

1 个答案:

答案 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