如何在MySQL中编写查询语句计算2天或3天的总金额?
嘿,我来帮你搞定这两个MySQL统计需求!首先得假设咱们有一张交易表(比如叫transactions),里面至少有amount(交易金额,建议用DECIMAL(10,2)类型)和created_at(交易时间,DATETIME或DATE类型)这两个核心字段——毕竟没有这些基础数据,统计就无从谈起啦。下面分需求给你具体的实现方法:
需求1:计算2天或3天的总金额
这里分两种最常见的场景,你可以根据实际情况选择:
场景A:统计最近N天的总金额
比如要算“从今天往前推2天/3天”的所有交易总和(包含今天)。举个例子,如果今天是2024-05-20,最近2天就是2024-05-18到2024-05-20的交易。
最近2天的总金额
SELECT SUM(amount) AS total_amount_last_2_days FROM transactions WHERE created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY) AND created_at < CURRENT_DATE() + INTERVAL 1 DAY;
这里用CURRENT_DATE()而不是NOW()是因为它只取日期部分,能避免时间戳带来的遗漏(比如不会漏掉今天23:59的交易)。
最近3天的总金额
把上面的INTERVAL 2 DAY改成INTERVAL 3 DAY就行:
SELECT SUM(amount) AS total_amount_last_3_days FROM transactions WHERE created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY) AND created_at < CURRENT_DATE() + INTERVAL 1 DAY;
场景B:统计指定日期范围的2天/3天总金额
如果是固定的某2天或3天(比如2024-05-18到2024-05-19这2天),直接指定日期范围即可:
指定2天范围的总金额
SELECT SUM(amount) AS total_amount_2_days FROM transactions WHERE created_at >= '2024-05-18 00:00:00' AND created_at <= '2024-05-19 23:59:59';
指定3天范围的总金额
SELECT SUM(amount) AS total_amount_3_days FROM transactions WHERE created_at >= '2024-05-17 00:00:00' AND created_at <= '2024-05-19 23:59:59';
需求2:分别统计3天与2天的金额总和(同时输出两个结果)
这个需求是要一次拿到两个统计值,不用跑两次查询。同样分两种场景:
场景A:同时统计最近3天和最近2天的总金额
用条件聚合就能实现,在同一个查询里计算两个总和,结果是一行数据,清晰明了:
SELECT SUM(CASE WHEN created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY) THEN amount ELSE 0 END) AS total_last_3_days, SUM(CASE WHEN created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY) THEN amount ELSE 0 END) AS total_last_2_days FROM transactions WHERE created_at < CURRENT_DATE() + INTERVAL 1 DAY; -- 过滤掉未来的测试交易(如果有的话)
场景B:同时统计指定3天和指定2天的总金额
比如指定3天是2024-05-17至2024-05-19,2天是2024-05-18至2024-05-19,写法类似:
SELECT SUM(CASE WHEN created_at >= '2024-05-17 00:00:00' AND created_at <= '2024-05-19 23:59:59' THEN amount ELSE 0 END) AS total_3_days, SUM(CASE WHEN created_at >= '2024-05-18 00:00:00' AND created_at <= '2024-05-19 23:59:59' THEN amount ELSE 0 END) AS total_2_days FROM transactions;
可选:分两行展示结果
如果你想要结果分两行(一行显示3天的统计,一行显示2天的),可以用UNION ALL:
-- 统计最近3天 SELECT 'last_3_days' AS period, SUM(amount) AS total_amount FROM transactions WHERE created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY) AND created_at < CURRENT_DATE() + INTERVAL 1 DAY UNION ALL -- 统计最近2天 SELECT 'last_2_days' AS period, SUM(amount) AS total_amount FROM transactions WHERE created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY) AND created_at < CURRENT_DATE() + INTERVAL 1 DAY;
这样结果会是两行,每行有时间段标识和对应的总金额,读起来也很直观。
小提示
- 如果你的
created_at是DATE类型(只有日期,没有时间),那条件可以简化,不用加时间部分,比如created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY)就足够。 - 记得给
created_at字段加索引!如果表数据量大,日期范围查询会慢很多,加索引能大幅提升性能。 - 如果
amount可能为NULL,SUM()会自动忽略NULL值,不用额外处理,但如果想把NULL当成0,可以用COALESCE(amount, 0)代替amount。
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

