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

SQL按外键分组求和TableB数量并关联TableA每行数据的实现问题

问题根因

  • 原有语句子查询按ForeignKeyId分组,导致每个外键ID仅返回1行结果,关联后自然只能输出4条数据,不符合逐行返回的需求
  • 原WHERE条件逻辑错误,BETWEEN的上下限被写为等效值,相当于仅筛选创建时间等于指定日期的行,完全达不到范围统计的效果
  • 额外注意:你提供的表结构中TableB的数量字段拼写为Qunatity,后续SQL引用时注意和实际表字段名保持一致

修正方案

方案1:窗口函数实现(推荐,兼容MySQL 8.0+、PostgreSQL、SQL Server等新版SQL引擎)

SELECT 
    a.*,
    b.quantity,
    -- 按外键ID分区,按创建时间升序做累计求和
    SUM(b.quantity) OVER (
        PARTITION BY a.ForeignKeyId 
        ORDER BY a.created_at ASC
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS `sum`
FROM TableA a
LEFT JOIN TableB b ON b.TableA_id = a.Id
-- 替换为你需要的静态起始日期
WHERE a.created_at >= '2020-07-28'
ORDER BY a.Id ASC;

方案2:关联子查询实现(兼容MySQL 5.x等不支持窗口函数的旧版本引擎)

SELECT 
    a1.*,
    b1.quantity,
    (
        SELECT SUM(b.quantity) 
        FROM TableA a
        INNER JOIN TableB b ON b.TableA_id = a.Id
        WHERE 
            a.ForeignKeyId = a1.ForeignKeyId 
            AND a.created_at >= '2020-07-28'
            AND a.created_at <= a1.created_at
    ) AS `sum`
FROM TableA a1
LEFT JOIN TableB b1 ON b1.TableA_id = a1.Id
WHERE a1.created_at >= '2020-07-28'
ORDER BY a1.Id ASC;

两种方案均实现需求:为TableA的每一行,统计同外键ID下,从指定静态日期到当前行创建时间范围内所有关联TableB的quantity累计求和,完全匹配你给出的示例输出效果。

内容的提问来源于stack exchange,提问作者E.Lahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 17:36:03