如何使用完全联接和group by,在SQL中不在该列中输入任何值的情况下,重复停止相同值的乘法和

如何使用完全联接和group by,在SQL中不在该列中输入任何值的情况下,重复停止相同值的乘法和,sql,sql-server,sum,left-join,full-outer-join,Sql,Sql Server,Sum,Left Join,Full Outer Join,我有两个表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时,减法正在进行,我的输出是 _________

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

如果您想在两个表中都允许不匹配的行,那么完全联接就是一种方法。我建议先在子查询中预聚合,以避免行相乘:

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)
如果需要两个表中的行,则使用内部联接;如果需要一个表中的所有行以及另一个表中的所有匹配行,则使用左联接:

select 
    t1.c1,
    t1.c2 - coalesce(t2.c1, 0) c2
from (select 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

我只是想说清楚。具有相同列名的两个表。T1.C1有两行1000。T2.C1有两行100?不是的,长官T2.C1只有一行100。请帮助我您加入的是正在求和的同一列,两个表之间是否有一个共同的键列?谢谢iceblade,这工作正常。如果只有一列被填充,如何显示值T1.c1在这种情况下,您只需添加isnull,我更新了查询。@NageshRaoNemmaniwar:这是一个左连接,而您以完全连接开始问题。他们不会做同样的事情。如果t2中缺少行,它们将不会出现在结果中,这是否适合您的用例?