You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:28:11