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

SQL实现按日期分组统计同base_id重复行数量并分日期展示

需求说明

存储业务数据后需要实现两个查询规则:

  • 同一日期下存在相同base_id的重复行时,合并为单行展示,同时计算对应quantity字段的总和
  • 相同base_id的行分属不同日期时,按日期分别独立展示

规则示例:测试数据中共有3条base_id为8的记录,其中2条日期相同,这2条需合并为单行并汇总quantity值;剩余1条base_id为8但日期不同的记录单独成行展示。

原有实现问题

当前使用的基础查询语句如下:

$records = $db->query("SELECT * FROM d_delivery_sargol LEFT OUTER JOIN d_base_list ON d_delivery_sargol.base_id=d_base_list.base_id");

之前尝试直接对date和base_id字段做GROUP BY分组但结果不符合预期,核心原因是:
直接使用SELECT *搭配GROUP BY不符合标准SQL语法规范,分组后既没有对quantity字段做显式求和聚合,非分组字段的返回值也存在不确定性,自然无法得到正确的合并结果。

正确查询方案

分组维度固定为「日期+base_id」即可完全匹配需求规则,注意不能直接用SELECT *通配符查询,需要显式声明返回字段,对需要汇总的quantity字段使用SUM()聚合函数:

SELECT
  d_delivery_sargol.date,
  d_delivery_sargol.base_id,
  SUM(d_delivery_sargol.quantity) AS total_quantity,
  -- 若d_base_list为base_id维度的维表,同base_id下字段值唯一,可直接查询d_base_list下需要的字段
  d_base_list.base_name,
  d_base_list.base_spec
  -- 其余需要的字段按上述格式逐个添加即可
FROM d_delivery_sargol
LEFT OUTER JOIN d_base_list ON d_delivery_sargol.base_id = d_base_list.base_id
GROUP BY d_delivery_sargol.date, d_delivery_sargol.base_id

注意事项

  • 如果数据库开启了ONLY_FULL_GROUP_BY模式,查询的非聚合字段需要全部加入GROUP BY子句,或者用ANY_VALUE()函数包裹对应字段避免报错
  • 如果存储的日期字段带时分秒,而合并规则是按自然日维度统计,需要将日期字段做年月日格式化后再分组,例如使用DATE(d_delivery_sargol.date) AS stat_date作为分组和返回的日期字段,避免同天不同时间的记录被拆分为不同分组

内容的提问来源于stack exchange,提问作者alfa rezai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:54:16