SQL:不是简单的左/右连接问题

问题描述 投票:0回答:4

我有两个表都有2列(名称[字符串],值[整数])我试图加入两个表格来显示每个名字的总和(值)之间的差异。例如

表1(T1):

N1  2
N1  3
N2  4
N3  5

表(T2):

N1  1
N2  1
N2  1

结果应如下所示:

N1 4  (5-1)
N2 2  (4-2)
N3 5  (5-0)  

如果其中一个表中缺少N,我们假设为0

我只知道如果名称存在于两个表中,如何进行连接,但我不知道如果在任一表中缺少名称,如何处理替换值为0的空结果。

我目前的查询:

select t1.name, t2.name, t1.Sum-t2.Sum as "Diff"
from (select t1.name, sum(t1.value) as Sum from t1 group by t1.name) t1 
inner join
(select t2.name, sum(t2.value) as Sum from t2 group by t2.name) t2 
on t1.name = t2.name

结果忽略N3,因为t1缺少N3。

谢谢

sql
4个回答
1
投票

您可以使用CTE(公用表表达式)聚合两个表,然后使用FULL OUTER JOIN将它们连接起来,如下所示:

with
l as (
  select name, sum(value) as total
  from table1
  group by name
),
r as (
  select name, sum(value) as total
  from table2
  group by name
)
select
  coalesce(l.name, r.name) as name,
  coalesce(l.total, 0) - coalesce(r.total, 0) as difference
from l
full outer join r on l.name = r.name
order by coalesce(l.name, r.name)

1
投票

使用FULL OUTER JOIN和ISNULL

SELECT ISNULL(x.name, y.name) as Name,
       ISNULL(x.sumValues, 0) - ISNULL(y.sumValues, 0) as ValueDiff
FROM
(SELECT name, SUM(value) AS sumValues FROM t1 GROUP BY name) x
    FULL OUTER JOIN
    (SELECT name, SUM(value) AS sumValues FROM t2 GROUP BY name) y
        ON x.name = y.name;

0
投票

一个非常简单的方法是union all和聚合:

select name, sum(value)
from ((select name, value
       from t1
      ) union all
      (select name, -value
       from t2
      )
     ) t
group by name;

join有点乱,因为它可能导致重复和缺失值,除非非常小心地完成。


0
投票

这将工作:

输入:

create table t1 (name varchar(20),value number);
create table t2 (name varchar(20),value number);
//do inserts

select name1,nvl(sum1-sum2,sum1) from(select sum(t1.value) as sum1,t1.name name1 from t1 group by t1.name)
,(select sum(t2.value) as sum2,t2.name name2 from t2 group by t2.name) where name1=name2(+);

输出:

N1  4
N2  2
N3  5
© www.soinside.com 2019 - 2024. All rights reserved.