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

