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

按日期范围统计关联表数值遇SQL 1055错误,求正确SQL语句

修正SQL分组错误并实现按日期范围统计求和

现有数据表

1. bayarlanjas表

tglbayarbayarlanjauser_id
2024-01-05101
2024-02-06201
2024-03-07301
2024-04-08401

2. zakats表

tglawalhaultglakhirhauluser_id
2024-01-012024-02-251
2024-03-012024-04-251

原SQL语句及错误

需求是按zakats表的日期范围,统计对应user_id的bayarlanja总和,原SQL如下:

SELECT
  zakats.*,
  bayarlanjas.user_id,
  sum(bayarlanja) AS total_bayar
FROM
  `zakats`
  LEFT JOIN `bayarlanjas` ON `bayarlanjas`.`user_id` = `zakats`.`user_id`
WHERE
  `bayarlanjas`.`tglbayar` BETWEEN zakats.tglawalhaul
  AND zakats.tglakhirhaul
  AND `zakats`.`user_id` = 1
GROUP BY
  `bayarlanjas`.`user_id`

执行后出现错误:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated

期望查询结果

tglawalhaultglakhirhaultotal_bayaruser_id
2024-01-012024-02-25301
2024-03-012024-04-25701

修正后的SQL语句

SELECT
  z.tglawalhaul,
  z.tglakhirhaul,
  z.user_id,
  COALESCE(SUM(b.bayarlanja), 0) AS total_bayar
FROM
  `zakats` z
LEFT JOIN `bayarlanjas` b 
  ON b.user_id = z.user_id
  AND b.tglbayar BETWEEN z.tglawalhaul AND z.tglakhirhaul
WHERE
  z.user_id = 1
GROUP BY
  z.tglawalhaul, z.tglakhirhaul, z.user_id

修正说明

  1. GROUP BY规则适配:原SQL仅按bayarlanjas.user_id分组,但SELECT中包含zakats.*这类非聚合字段,在开启ONLY_FULL_GROUP_BY模式的MySQL中,所有非聚合字段必须出现在GROUP BY子句里。这里按zakats表的tglawalhaul、tglakhirhaul、user_id分组,确保每个分组对应一个独立的日期区间。
  2. 保留LEFT JOIN特性:原SQL把日期过滤条件放在WHERE子句中,会导致LEFT JOIN退化为INNER JOIN(WHERE会过滤掉bayarlanjas无匹配的行),将日期条件移到JOIN的ON子句中,可保留zakats表的所有行。
  3. 空值处理:用COALESCE将SUM结果转为0,避免某个日期区间无匹配记录时返回NULL。

内容的提问来源于stack exchange,提问作者M. Ade Erik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:12:39