我有两张桌子。第一个表具有正值,第二个表具有负值。像这样
我测试了合并两个表以根据 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的结果应该是正数和负数之间的相同数字。我试图解决这个问题,但仍然不起作用。
请帮我解决这个问题
在连接表之前使用内部连接和 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)