如何修改SQL查询实现Inv_SumNetTotal逐日累加展示?
实现逐日累加的发票金额统计
你可以通过窗口函数结合CTE(公共表表达式)简化原查询逻辑,同时实现逐月的逐日累加效果,修改后的SQL如下:
WITH daily_stats AS ( SELECT invoice.Date AS Inv_Date, COUNT(*) AS NoOfInv, SUM(Total) AS Daily_SumNetTotal FROM invoice -- 一次性筛选上月初到当前月末的所有数据,替代原两次查询+UNION ALL WHERE invoice.Date BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 MONTH, '%Y-%m-01') AND LAST_DAY(NOW()) GROUP BY invoice.Date ) SELECT NoOfInv, Inv_Date, -- 按月份分区,逐日累加当日金额 SUM(Daily_SumNetTotal) OVER ( PARTITION BY DATE_FORMAT(Inv_Date, '%Y-%m') ORDER BY Inv_Date ASC ) AS Inv_SumNetTotal, -- 若需要千分位格式化(如期望输出的1,006,822),替换上面的Inv_SumNetTotal为以下语句: -- FORMAT(SUM(Daily_SumNetTotal) OVER (PARTITION BY DATE_FORMAT(Inv_Date, '%Y-%m') ORDER BY Inv_Date ASC), 0) AS Inv_SumNetTotal FROM daily_stats ORDER BY Inv_Date;
关键逻辑说明:
- CTE
daily_stats:先一次性统计目标时间范围内(上月初到当前月末)每日的发票数量和当日总金额,比原两次查询更高效简洁。 - 窗口函数
SUM() OVER():PARTITION BY DATE_FORMAT(Inv_Date, '%Y-%m'):确保累计计算按月份独立进行,避免上月金额累加到当月。ORDER BY Inv_Date ASC:保证按日期顺序从当月第一天开始逐日累加。
- 千分位格式化:使用
FORMAT()函数可将数值转为带千分位的字符串,匹配你期望的输出格式。
内容的提问来源于stack exchange,提问作者Bhathiya Prasad
相关产品推荐
相关产品推荐

