You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:06:23