如何通过SQL计算近24个月数据的总和及平均值?
针对你的SQL统计需求的实现方案
嘿,我来帮你搞定这个数据统计的需求!针对你数据库里的记录(字段:ID、Store_ID、Date、Sales),我会分两个核心需求,结合不同主流数据库的语法给出具体实现——毕竟不同数据库的日期处理函数差异不小~
一、计算从本月起往前推24个月内数据的总和与平均值
这里先明确范围:“从本月起往前推24个月”通常指当前日期往前回溯24个月的时间段(比如今天是2024-05-20,范围就是2022-05-20到2024-05-20);如果你的需求是过去24个完整自然月(比如2022-05到2024-04),我也会补充调整方式。
1. 整体统计(不分门店)
MySQL 写法
SELECT SUM(Sales) AS total_sales_last_24months, AVG(Sales) AS avg_sales_last_24months FROM your_table_name WHERE Date >= DATE_SUB(CURDATE(), INTERVAL 24 MONTH);
如果要限定为过去24个完整自然月(不含本月),可以把条件改成:
Date BETWEEN DATE_SUB(CURDATE(), INTERVAL 24 MONTH) AND LAST_DAY(CURDATE() - INTERVAL 1 MONTH)
PostgreSQL 写法
SELECT SUM(Sales) AS total_sales_last_24months, AVG(Sales) AS avg_sales_last_24months FROM your_table_name WHERE "Date" >= CURRENT_DATE - INTERVAL '24 months';
(注:PostgreSQL里Date是关键字,需要用双引号括起来)
SQL Server 写法
SELECT SUM(Sales) AS total_sales_last_24months, AVG(Sales) AS avg_sales_last_24months FROM your_table_name WHERE Date >= DATEADD(MONTH, -24, GETDATE());
2. 按门店分组统计
如果需要每个门店单独计算近24个月的总和与平均值,只需加上GROUP BY Store_ID即可,以MySQL为例:
SELECT Store_ID, SUM(Sales) AS total_sales_last_24months, AVG(Sales) AS avg_sales_last_24months FROM your_table_name WHERE Date >= DATE_SUB(CURDATE(), INTERVAL 24 MONTH) GROUP BY Store_ID;
其他数据库只需替换对应的日期函数即可。
二、计算过去24个月及以上数据的总和
这个需求就是筛选出早于近24个月起始日期的数据,然后求和,同样分两种场景:
1. 整体统计(不分门店)
MySQL 写法
SELECT SUM(Sales) AS total_sales_older_than_24months FROM your_table_name WHERE Date < DATE_SUB(CURDATE(), INTERVAL 24 MONTH);
PostgreSQL 写法
SELECT SUM(Sales) AS total_sales_older_than_24months FROM your_table_name WHERE "Date" < CURRENT_DATE - INTERVAL '24 months';
SQL Server 写法
SELECT SUM(Sales) AS total_sales_older_than_24months FROM your_table_name WHERE Date < DATEADD(MONTH, -24, GETDATE());
2. 按门店分组统计
同样加上GROUP BY Store_ID即可,以PostgreSQL为例:
SELECT Store_ID, SUM(Sales) AS total_sales_older_than_24months FROM your_table_name WHERE "Date" < CURRENT_DATE - INTERVAL '24 months' GROUP BY Store_ID;
小提示
- 记得把
your_table_name替换成你实际的表名; - 如果你的
Date字段是字符串类型(不推荐),需要先转换成日期格式,比如MySQL用STR_TO_DATE(Date, '%Y-%m-%d'),确保日期比较的准确性; - 如果需要精确到“本月起始往前推24个月”(比如从2022-05-01到2024-05-31),可以调整日期条件,比如MySQL用
Date >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 24 MONTH), '%Y-%m-01')。
内容的提问来源于stack exchange,提问作者user9384107




