如何通过单条SQL查询实现按日期的累计金额汇总?
如何用单条SQL查询实现按日期的累计金额求和?
当然可以!借助现代SQL的窗口函数,就能基于你已有的每日求和查询轻松扩展出累计求和功能,逻辑简洁且高效。
方案1:基于CTE的分步实现
先通过公共表表达式(CTE)算出每日的金额总和,再用窗口函数计算累计值,逻辑清晰易懂:
WITH DailySums AS ( -- 复用你的查询得到每日金额总和 SELECT s.date, SUM(s.amount) AS daily_total FROM dbo.Financieel AS s GROUP BY s.date ) SELECT date, daily_total, -- 窗口函数计算从最早日期到当前日期的累计总和 SUM(daily_total) OVER (ORDER BY date) AS cumulative_total FROM DailySums ORDER BY date;
方案2:更简洁的聚合+窗口函数结合
SQL Server支持在窗口函数中嵌套聚合函数,所以你可以直接把两步合并成一个查询,无需CTE:
SELECT s.date, SUM(s.amount) AS daily_total, -- 先聚合每日总和,再对这些总和做累计求和 SUM(SUM(s.amount)) OVER (ORDER BY s.date) AS cumulative_total FROM dbo.Financieel AS s GROUP BY s.date ORDER BY s.date;
关键细节说明
SUM(...) OVER (ORDER BY date)是实现累计的核心:这个窗口函数会为每一行计算从结果集第一行到当前行的总和,ORDER BY date确保累加严格按照日期先后顺序进行。- 如果你的
date字段是字符串类型(比如存储01-01-2019这类文本),建议先转换为日期类型再排序,避免字符串排序导致的顺序错误。比如把ORDER BY date改成ORDER BY CONVERT(date, s.date, 105)(105是SQL Server中对应dd-mm-yyyy格式的转换代码)。
示例结果验证
针对你的测试数据,执行后会得到如下结果,完全符合需求:
| date | daily_total | cumulative_total |
|---|---|---|
| 01-01-2019 | 40 | 40 |
| 02-01-2019 | 20 | 60 |
| 03-01-2019 | 40 | 100 |
内容的提问来源于stack exchange,提问作者AndreThen
相关产品推荐
相关产品推荐

