T-SQL中通过关联三张表为主表添加关联表的聚合求和值
问题修正:按A表ID分组计算关联金额总和
表结构与关联规则
- A表:
jira_unresolved_sales_issue_v(主表),id为唯一标识 - B表:
jira_causes_links_v(关联中间表),通过srcID关联A表id,dstID关联C表issueid - C表:
jira_invoices_v,需计算状态不为Canceled的金额总和,issueid为唯一标识
需求:通过左连接将C表符合条件的金额总和对应到A表每条记录,最终按A表id分组得到金额合计。
原SQL问题分析
原SQL在GROUP BY中错误包含了C.amount,这会导致每个不同的C表求和结果都单独分组,进而返回过多行数,无法实现按A表id正确汇总的需求。
select A.id, sum(C.Amount) as amount from A LEFT JOIN B on A.id = B.srcID LEFT JOIN ( Select C.issueid, sum(C.amount) as amount FROM C WHERE C.status <> 'Canceled' GROUP BY C.issueid) as C on B.dstID= C.issueID GROUP BY A.ID, C.amount -- 此处C.amount属于多余分组条件,会拆分结果
修正后的SQL
SELECT A.id, COALESCE(SUM(C.amount), 0) AS total_amount -- 处理无关联记录时的null值,转为0 FROM jira_unresolved_sales_issue_v A LEFT JOIN jira_causes_links_v B ON A.id = B.srcID LEFT JOIN ( SELECT issueid, SUM(amount) AS amount FROM jira_invoices_v WHERE status <> 'Canceled' GROUP BY issueid ) C ON B.dstID = C.issueid GROUP BY A.id -- 仅按主表唯一标识分组,确保每条A记录对应一行汇总结果
关键修正点
- 移除
GROUP BY中的C.amount,仅保留A.id,保证按主表维度正确分组 - 使用
COALESCE函数将无关联记录时的NULL求和结果转为0,避免结果出现空值 - 内层子查询已按C表
issueid完成金额汇总,外层对关联到的C表汇总值再次求和,适配一个A记录对应多个B、C记录的场景
内容的提问来源于stack exchange,提问作者Szymon Kocejko
相关产品推荐
相关产品推荐

