基于日期筛选的SQL SUMIFS功能实现技术问询
解决方案
你的原始查询问题在于,WHERE子句仅筛选了当前行的条件,导致每个分组仅包含当前行,无法汇总符合要求的其他行数据。要实现需求,需要通过自连接或关联子查询跨行匹配并汇总数据。
方法1:关联子查询(通用SQL方言)
为每行数据单独查询符合条件的汇总值:
SELECT -- 可选:格式化日期为MM/DD/YYYY格式,根据SQL方言调整 -- PostgreSQL: TO_CHAR(a.reporting_date, 'MM/DD/YYYY') AS reporting_date -- MySQL: DATE_FORMAT(a.reporting_date, '%m/%d/%Y') AS reporting_date -- SQL Server: FORMAT(a.reporting_date, 'MM/dd/yyyy') AS reporting_date a.reporting_date, ( SELECT SUM(b.gross_amount) FROM "Table A" b WHERE b.reporting_date <= a.reporting_date AND b.deposit_date > a.reporting_date ) AS deposits, -- 可选:生成逻辑说明字符串(根据SQL方言调整) -- PostgreSQL: (SELECT STRING_AGG(CAST(b.gross_amount AS TEXT), ' + ') FROM "Table A" b WHERE b.reporting_date <= a.reporting_date AND b.deposit_date > a.reporting_date) AS logic -- MySQL: (SELECT GROUP_CONCAT(b.gross_amount SEPARATOR ' + ') FROM "Table A" b WHERE b.reporting_date <= a.reporting_date AND b.deposit_date > a.reporting_date) AS logic a.gross_amount FROM "Table A" a ORDER BY a.reporting_date DESC;
方法2:自连接+分组汇总
通过自连接匹配所有符合条件的行,再分组计算总和:
SELECT a.reporting_date, SUM(b.gross_amount) AS deposits, -- 可选:生成逻辑说明字符串 -- PostgreSQL: STRING_AGG(CAST(b.gross_amount AS TEXT), ' + ') AS logic -- MySQL: GROUP_CONCAT(b.gross_amount SEPARATOR ' + ') AS logic a.gross_amount FROM "Table A" a JOIN "Table A" b ON b.reporting_date <= a.reporting_date AND b.deposit_date > a.reporting_date GROUP BY a.reporting_date, a.gross_amount ORDER BY a.reporting_date DESC;
关键细节说明
- 表名处理:如果表名包含空格,需用对应SQL方言的引号包裹(如PostgreSQL用双引号,SQL Server用方括号),或重命名为无空格的
TableA。 - 日期格式化:若需要将日期转换为
MM/DD/YYYY格式,使用注释中对应的日期格式化函数即可。 - 逻辑列:
Logic列仅用于展示计算逻辑,实际业务中可按需保留,不同SQL方言的字符串聚合函数不同(如STRING_AGG、GROUP_CONCAT)。
内容的提问来源于stack exchange,提问作者Tanuj
相关产品推荐
相关产品推荐

