查询多个表进行 SUM 计算
在关系数据库中,通常需要跨多个表进行数据聚合。这对于汇总值或计算总计特别有用。然而,了解数据汇总的原理对于确保结果准确非常重要。
查询两个表 AP 和 INV 时会出现这样的情况,这两个表共享一个名为 [PROJECT] 的公共列。目标是返回一个结果集,其中包含 PROJECT 作为主键和两个汇总列:SUM_AP 和 SUM_INV,分别表示 AP 和 INV 表中每个项目的 Value 列的总和。
常见方法解决这个问题的方法是使用 INNER JOIN 操作,如以下代码所示:
SELECT AP.[PROJECT], SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV FROM AP INNER JOIN INV ON (AP.[PROJECT] =INV.[PROJECT]) WHERE AP.[PROJECT] = 'XXXXX' GROUP BY AP.[PROJECT]
但是,此查询返回不正确的结果,因为分组操作(GROUP BY)在求和(SUM)之前应用。这会导致总和中包含重复值,从而导致总数膨胀。
要解决此问题,更准确的方法是使用子选择对每个表单独执行聚合:
SELECT AP1.[PROJECT], (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP, (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV FROM AP AS AP1 INNER JOIN INV AS INV1 ON (AP1.[PROJECT] =INV1.[PROJECT]) WHERE AP1.[PROJECT] = 'XXXXX' GROUP BY AP1.[PROJECT]
此修改后的查询使用 SUM 函数中的子选择来计算每个项目的 SUM_AP 和 SUM_INV 值。子查询根据匹配的 PROJECT 值独立聚合每个表的 Value 列,消除重复值的问题。
利用这种方法,您可以有效地查询多个表并执行精确的聚合操作,以获得期望的汇总结果,没有任何错误的计算。
以上是如何在SQL中准确计算多个表的SUM?的详细内容。更多信息请关注PHP中文网其他相关文章!