SQL如何使用另一张表的日期区间过滤后按日期分组统计成本总和
问题排查
你现有查询存在两个核心问题:
- 仅统计了有符合条件消费记录的月份,无消费的月份不会自动出现在结果中
- 未对空聚合结果做转换,无法输出要求的
-占位符
解决方案
你需要先生成覆盖所有需要统计的时间范围的连续月份最后一天序列,再左关联你已经计算好的符合条件的月度聚合结果,最后处理空值即可。以下以MySQL为例的可运行代码,其他数据库仅需调整连续月份生成语法:
WITH RECURSIVE all_months AS ( -- 生成统计范围的所有月份最后一天,可根据实际需求调整起止时间 SELECT LAST_DAY(MIN(start_date)) as month_end FROM table2 UNION ALL SELECT LAST_DAY(month_end + INTERVAL 1 MONTH) FROM all_months WHERE month_end < (SELECT MAX(end_date) FROM table2) ), valid_cost AS ( -- 计算符合区间条件的月度成本总和 SELECT LAST_DAY(t1.date) as month_end, SUM(REPLACE(t1.cost, '$', '') + 0) as total_cost -- 处理示例中cost带$符号的场景,实际为数值可删除转换逻辑 FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id AND t1.date BETWEEN t2.start_date AND t2.end_date GROUP BY LAST_DAY(t1.date) ) -- 关联输出最终结果 SELECT am.month_end, IFNULL(vc.total_cost, '-') as total_cost FROM all_months am LEFT JOIN valid_cost vc ON am.month_end = vc.month_end ORDER BY am.month_end;
内容的提问来源于stack exchange,提问作者Vedant
相关产品推荐
相关产品推荐

