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

SQL如何统计同日数据条目数并按日汇总对应金额?

现有写法问题说明
  • 初始按天GROUP BY的查询逻辑本身正确,但按天分组后同日期的多条明细会被折叠为单条聚合结果,无法返回单条记录维度的全部字段。
  • 带窗口函数的尝试写法存在3个核心错误:
    • GROUP BY子句加入唯一主键id后,分组粒度变为单条记录,完全失去按天聚合的效果,每个分组仅对应1行数据
    • 窗口函数未指定PARTITION BY分区规则,仅用ORDER BY会统计从最早记录到当前行的全局累计值,而非同一日期维度的汇总值
    • SELECT *与GROUP BY date(datetime), id的分组粒度不匹配,在开启严格SQL模式的数据库(如PostgreSQL、开启ONLY_FULL_GROUP_BY的MySQL)中会直接抛出语法错误。
正确实现方案

根据你需要的输出粒度,二选一即可:

方案1:按天聚合输出(每个日期返回1行统计结果)

直接在你最初能正常运行的SQL基础上补充amount求和逻辑即可,适合只需要看每日汇总数据的场景:

SELECT
    DATE_TRUNC('day', datetime) AS stat_date,
    COUNT(*) AS daily_record_count,
    SUM(amount) AS daily_amount_sum
FROM Table1
GROUP BY DATE_TRUNC('day', datetime)
ORDER BY stat_date;

方案2:保留全量明细,每行附带所属日期的汇总值

如果需要展示所有明细列,同时每行都能看到当天的总记录数、当天总金额,不要加GROUP BY,使用带日期分区的窗口函数即可:

SELECT
    *,
    DATE_TRUNC('day', datetime) AS stat_date,
    COUNT(*) OVER(PARTITION BY DATE_TRUNC('day', datetime)) AS daily_record_count,
    SUM(amount) OVER(PARTITION BY DATE_TRUNC('day', datetime)) AS daily_amount_sum
FROM Table1
ORDER BY datetime;

补充:如果你实际要的是从第一条记录开始逐行累加的全局累计值(而非同日期汇总),去掉PARTITION BY子句即可,排序时建议加入唯一主键id保证顺序稳定,避免同一时间点多条记录时统计偏差:

SELECT
    *,
    COUNT(id) OVER(ORDER BY datetime, id) AS accumulated_count,
    SUM(amount) OVER(ORDER BY datetime, id) AS accumulated_amount
FROM Table1
ORDER BY datetime, id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:27:21