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
相关产品推荐
相关产品推荐

