SQL技术问题:基于父表Tb1的ID从关联子表获取正确汇总值
问题分析与解决
你的SQL结果数值不对,核心原因是直接关联TransByDep和TRANSUP会产生笛卡尔积——比如某个部门(dep)有多条销售记录和多条采购记录,连接后每条销售记录都会和每条采购记录配对,导致求和时数值被重复计算,最终汇总值偏大。
修正后的SQL语句
先分别对销售、采购数据按部门ID单独汇总,再关联到部门表和部门类型表,彻底避免笛卡尔积的影响:
SELECT dt.Type_ID, dt.DepType, COALESCE(tbd.SUM_SALES, 0) AS SALES, COALESCE(tu.SUM_PURCHASE, 0) AS PURCHASE FROM DepartmentType dt INNER JOIN dep d ON dt.Type_ID = d.Type_ID LEFT JOIN ( -- 按部门汇总销售金额 SELECT Dep_Id, SUM(Amount) AS SUM_SALES FROM TransByDep GROUP BY Dep_Id ) tbd ON d.Dep_ID = tbd.Dep_Id LEFT JOIN ( -- 按部门汇总采购金额 SELECT Dep_id, SUM(Check_amount) AS SUM_PURCHASE FROM TRANSUP GROUP BY Dep_id ) tu ON d.Dep_ID = tu.Dep_id GROUP BY dt.Type_ID, dt.DepType, tbd.SUM_SALES, tu.SUM_PURCHASE
关键说明
- 子查询先完成单表的汇总计算,再进行多表关联,从根源上消除了多表连接带来的行重复问题。
- 用
LEFT JOIN替代INNER JOIN,搭配COALESCE函数,确保即使某个部门没有销售或采购记录,也能返回0值,不会漏掉对应部门类型的数据。
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

