使用任何联接时出现重复记录

Jen*_*Fen 3 sql oracle

我有两张桌子。第一个表具有正值,第二个表具有负值。像这样

在此输入图像描述

在此输入图像描述

我测试了合并两个表以根据 trx_number 得出 SUM(positive.nett) 和 SUM(negative.nett) 的总计,然后我将合并结果总计(SUM Positive + SUM Negative)

SELECT p.trx_number,
       SUM(p.nett) total1,
       SUM(n.nett) total2
  FROM positif p
  FULL JOIN negatif n
    ON p.trx_number = n.trx_number
 GROUP BY p.trx_number
Run Code Online (Sandbox Code Playgroud)

但结果是这样的

在此输入图像描述

我意识到数字3(trx_id)有重复的结果,并且数字3的结果应该是正数和负数之间的相同数字。我试图解决这个问题,但仍然不起作用。

请帮我解决这个问题

ste*_*fan 5

在连接表之前使用内部连接和 GROUP BY 。

例子

create table positif ( trx, nett )
as 
select 3, 2147600 from dual union all
select 3, 2068300 from dual union all
select 4, 50000   from dual union all
select 5, 100000  from dual ;

create table negatif ( trx, nett )
as
select 3, -1073800 from dual union all
select 3, -1073800 from dual union all
select 3, -2068300 from dual union all
select 4, -20000   from dual union all
select 5, -100000  from dual ;
Run Code Online (Sandbox Code Playgroud)

询问

select P.trx, P.sum_ totalpos, N.sum_ totalneg
from 
  ( select trx, sum( nett ) sum_ from positif group by trx ) P
  join
  ( select trx, sum( nett ) sum_ from negatif group by trx ) N
  on P.trx = N.trx 
order by 1
;

-- result
TRX TOTALPOS    TOTALNEG
3   4215900     -4215900
4   50000       -20000
5   100000      -100000
Run Code Online (Sandbox Code Playgroud)

数据库小提琴

完全连接的主要问题是它返回太多行。例如,尝试仅加入 TRX 列 -> 您会得到 2 乘以 3 (6) 行。您需要的是:每个 TRX 值一行。(因此,在加入之前先进行分组。)

太多行...

select P.trx
from positif P full join negatif N on P.trx = N.trx ;

TRX
3
3
3
3
3
3
4
5
Run Code Online (Sandbox Code Playgroud)

替代方案:您还可以使用 UNION ALL,然后使用 GROUP BY(和总和),例如

联合所有

select trx, nett as pos, null as neg from positif
union all
select trx, null, nett from negatif ;

-- result
TRX POS     NEG
3   2147600 null
3   2068300 null
4   50000   null
5   100000  null
3   null    -1073800
3   null    -1073800
3   null    -2068300
4   null    -20000
5   null    -100000
Run Code Online (Sandbox Code Playgroud)

分组依据和求和

select trx 
, sum ( pos ) totalpos, sum( neg ) totalneg 
from (
  select trx, nett as pos, null as neg from positif
  union all
  select trx, null, nett from negatif 
) 
group by trx 
order by 1 ;

-- result
TRX TOTALPOS    TOTALNEG
3   4215900 -4215900
4   50000   -20000
5   100000  -100000
Run Code Online (Sandbox Code Playgroud)