SQL多对多关联场景:先分组事务表再左主表关联的实现问询
解决主表左关联事务表分组聚合值的问题
别担心,这个需求其实很好实现——核心思路就是把你已经写好的表2分组查询作为一个临时数据集,再和表1做左关联就可以了,完美适配你说的多对多场景。
我给你两种常用的写法,你可以根据自己的习惯选:
写法一:子查询关联
直接把表2的分组逻辑嵌套在LEFT JOIN里,语法简洁:
SELECT t1.[Job No_], t1.[Document Type], t1.[No_], t1.[Document No_], t1.[Version], t1.[Shipment Date], ISNULL(t2.[Amount], 0) AS [Total Amount] -- 处理无匹配时的NULL值,显示0更友好 FROM [XX].[dbo].[XX] t1 LEFT JOIN (SELECT [Document No_], SUM([Amount]) AS [Amount] FROM [XX].[dbo].[YY] GROUP BY [Document No_]) t2 ON t1.[Document No_] = t2.[Document No_]
写法二:CTE(公共表表达式)关联
如果后续逻辑有扩展需求,这种写法可读性更强,维护起来更方便:
WITH AggregatedTransactions AS ( SELECT [Document No_], SUM([Amount]) AS [Amount] FROM [XX].[dbo].[YY] GROUP BY [Document No_] ) SELECT t1.[Job No_], t1.[Document Type], t1.[No_], t1.[Document No_], t1.[Version], t1.[Shipment Date], ISNULL(at.[Amount], 0) AS [Total Amount] FROM [XX].[dbo].[XX] t1 LEFT JOIN AggregatedTransactions at ON t1.[Document No_] = at.[Document No_]
小提示:
我特意加了ISNULL(..., 0),是因为左关联时,如果表1的某条记录在表2里没有对应的Document No_,聚合后的Amount会是NULL,用这个函数可以把它转换成0,更贴合业务上“无交易则金额为0”的逻辑。
内容的提问来源于stack exchange,提问作者Mr. Andersen
相关产品推荐
相关产品推荐

