问题描述
我有两个表T1和T2,两个表C1和C2中有两个相同的列,我正在使用完全连接和分组依据来减去两列的总和,但是当我在T1.C2或T2.C2中添加值时其他列的值会自动相乘。我想停止这种乘法,请帮助我
我的查询是
Select T1.C1,(Sum(T1.C2)-Sum(T2.C2))
from T1
Full join T2 on T1.C1=T2.C1
group by T1.C1;
当我在T1.C2中输入值1000和在T2.C2中输入值100时,就在我的输出是减法了
___________
|C1 C2. |
| |
|A 900 |
| |
但是当我在C1.C2中再次输入1000时,输出出错了
____________
|C1 C2. |
| |
|A 1800 |
| |
预期输出为1900
解决方法
我认为这可以满足您的需求
select
(select sum(t1.C1) from (values (1000),(1000)) T1(C1))-
(select sum(t2.C1) from (values (100)) T2(C1));
结果
1900
,
这可以做到:
select T1.C1,sum(T1.C2) - (Select isnull(sum(T2.C2),0) From T2 where T1.C1 = T2.C1)
From T1
group by T1.C1
输出:
A 1900
,
如果要在两个表中都允许不匹配的行,则可以使用full join
。我建议先在子查询中进行预聚合,以免增加行数:
select
coalesce(t1.c1,t2.c1) c1,coalesce(t1.c2,0) -
coalesce(t2.c1,0) c2
from (select c1,sum(c2) sum_c2 from t1) t1
full join (select c1,sum(c2) sum_c2 from t2) on t1.c1 = t2.c1
group by coalesce(t1.c1,t2.c1)
如果要从两个表中获取行,请使用inner join
,如果要从一个表中获取所有行,而从另一个表中获取所有匹配的行,请使用left join
:
select
t1.c1,t1.c2 - coalesce(t2.c1,sum(c2) sum_c2 from t1) t1
left join (select c1,sum(c2) sum_c2 from t2) on t1.c1 = t2.c1
group by t1.c1