首页 > 解决方案 > 选择内连接返回错误结果

问题描述

我正在使用如下选择内部联接。如何获得预期的结果?

这是sql语法:

select tgr.id, tgr.venid, sum(tgrd.qty*tgrd.pri), sum(tgrp.amo)
from tgr inner join tgrd on tgr.id = tgrd.id
inner join tgrp on tgr.id = tgrp.id
where tgr.id = 3
group by tgr.id, tgr.venid
having sum(tgrd.qty*tgrd.pri)-sum(tgrp.amo)>0;

结果:

3 | 1 | 462000 | 262000

但我期待结果:

3 | 1 | 231000 | 131000

来自 3 个表:tgr、tgrd、tgrp

tgr table
id  venid
3   1

tgrd table
id  plu qty pri
3   2   2.7 45000
3   1   7.3 15000

tgrp table
id  type  amo
3   2     0
3   2     131000

任何帮助将不胜感激。

标签: sqlinner-join

解决方案


tgr因为从totgrd和有多对多的关系tgrp,所以需要在 ing 表之前执行聚合JOIN,否则您可以对每个值进行加倍(或更多)计数。此查询将为您提供所需的结果:

select tgr.id, tgr.venid, total, amo
from tgr 
inner join (select id, sum(qty*pri) as total
            from tgrd
            group by id) tgrd on tgr.id = tgrd.id
inner join (select id, sum(amo) as amo
            from tgrp
            group by id) tgrp on tgr.id = tgrp.id
where tgr.id = 3
group by tgr.id, tgr.venid
having total - amo > 0;

输出:

id  venid   total       amo
3   1       231000.00   131000

3v4l.org 上的演示


推荐阅读