如何将Payments表付款总额更新至Invoice表的PayTotal字段
原有SQL错误原因
- 聚合子查询未加
GROUP BY InvNum_FK:SUM(PayAmt)会把所有付款记录汇总成单条总金额,无法按发票维度拆分对应 - 聚合子查询未设置别名:JOIN关联时直接调用
Payments表名找不到子查询返回的Total、InvNum_FK字段 - 可选优化:如果用INNER JOIN会跳过没有付款记录的发票,无法将其
PayTotal更新为0
适配SQL Server的正确更新语句(匹配你提供的dbo schema)
UPDATE i SET i.PayTotal = ISNULL(p.Total, 0), i.PayCount = ISNULL(p.PayCnt, 0) -- 若不需要更新付款次数字段可删除此行 FROM dbo.Invoices i LEFT JOIN ( SELECT InvNum_FK, SUM(PayAmt) AS Total, COUNT(*) AS PayCnt FROM dbo.Payments GROUP BY InvNum_FK ) p ON i.InvNum_PK = p.InvNum_FK
执行后结果验证:
- 发票
GLI101已付总额为751.65,付款次数3 - 发票
GLI404已付总额为530.92,付款次数2 - 其余无付款记录的发票已付总额为0,付款次数0
其他数据库兼容写法参考(MySQL为例)
UPDATE Invoices i LEFT JOIN ( SELECT InvNum_FK, SUM(PayAmt) AS Total, COUNT(*) AS PayCnt FROM Payments GROUP BY InvNum_FK ) p ON i.InvNum_PK = p.InvNum_FK SET i.PayTotal = IFNULL(p.Total, 0), i.PayCount = IFNULL(p.PayCnt, 0)
内容的提问来源于stack exchange,提问作者user1636620
相关产品推荐
相关产品推荐

