You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期筛选的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;

关键细节说明

  1. 表名处理:如果表名包含空格,需用对应SQL方言的引号包裹(如PostgreSQL用双引号,SQL Server用方括号),或重命名为无空格的TableA。
  2. 日期格式化:若需要将日期转换为MM/DD/YYYY格式,使用注释中对应的日期格式化函数即可。
  3. 逻辑列:Logic列仅用于展示计算逻辑,实际业务中可按需保留,不同SQL方言的字符串聚合函数不同(如STRING_AGG、GROUP_CONCAT)。

内容的提问来源于stack exchange,提问作者Tanuj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:00:18