多表关联GROUP BY仍返回重复行?SQL查询问题求助
解决SQL统计中的重复行问题
嘿,这个重复行的坑我踩过好多次!问题出在你直接把主表t_loan和两个一对多关联的子表t_loan_item、t_loan_payment做了连接——当一个贷款有多条贷款项和多条还款记录时,这两个子表的行会形成笛卡尔积,导致求和时被重复计算,最终出现重复行和错误的统计值。
解决方案:先分别统计,再关联
核心思路是先对两个子表单独做分组汇总,得到每个id_loan对应的唯一统计结果,再和主表关联,这样就不会产生交叉重复了。下面给两种常用写法:
方法1:使用CTE(公共表表达式,可读性更强)
WITH loan_totals AS ( -- 先统计每个贷款的总贷款金额 SELECT id_loan, SUM(Quantity * unit_price) AS total_loan FROM t_loan_item GROUP BY id_loan ), payment_totals AS ( -- 再统计每个贷款的总还款金额 SELECT id_loan, SUM(amount_payment) AS total_payment FROM t_loan_payment GROUP BY id_loan ) -- 最后关联主表和两个统计结果 SELECT t.id_customer, t.id_loan, -- 用COALESCE处理没有贷款项的情况,返回0而非NULL COALESCE(lt.total_loan, 0) AS total_loan, -- 同理处理没有还款记录的情况 COALESCE(pt.total_payment, 0) AS total_payment FROM t_loan t LEFT JOIN loan_totals lt ON t.id_loan = lt.id_loan LEFT JOIN payment_totals pt ON t.id_loan = pt.id_loan;
方法2:使用子查询(兼容所有数据库)
如果你的数据库不支持CTE,也可以用关联子查询的方式:
SELECT t.id_customer, t.id_loan, COALESCE( (SELECT SUM(Quantity * unit_price) FROM t_loan_item WHERE id_loan = t.id_loan), 0 ) AS total_loan, COALESCE( (SELECT SUM(amount_payment) FROM t_loan_payment WHERE id_loan = t.id_loan), 0 ) AS total_payment FROM t_loan t;
为什么这样有效?
- 先对子表分组统计,确保每个
id_loan只生成一条汇总记录,避免了交叉连接带来的笛卡尔积。 COALESCE函数可以处理边缘情况:比如某个贷款还没有生成贷款项,或者还没有还款记录时,会返回0而不是NULL,让统计结果更符合预期。- 因为
t_loan中每个id_loan对应唯一的id_customer,所以直接选择t.id_customer就满足了按id_loan和id_customer统计的需求。
内容的提问来源于stack exchange,提问作者Aris
相关产品推荐
相关产品推荐

