如何使用完全连接和分组依据

问题描述

我有两个表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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...