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

WHERE语句放置位置咨询及基于日期的累计百分比SQL实现

解决你的SQL累计百分比计算问题

我明白你要做的是:针对tblTourns_atp里的每一行,计算同一个ID_Ti分组下,日期小于等于当前行日期的所有记录中,FS_1总和占FSOF_1总和的百分比,对吧?下面给你两种可行的方案,重点说明WHERE语句的放置位置:

方案一:使用关联子查询(符合你提到的WHERE语句需求)

这种方法里,WHERE语句是放在子查询内部的,用来限定当前行所属的ID_Ti分组,同时筛选出该分组内日期不晚于当前行的记录,从而计算累计总和。

SELECT
    t.ID_T,
    t.ID_Ti,
    t.DATE,
    -- 计算累计百分比,保留整数位
    ROUND(
        -- 子查询1:同ID_Ti且日期<=当前行的FS_1总和
        (SELECT SUM(s2.FS_1) 
         FROM tblTourns_atp t2 
         INNER JOIN stat_atp s2 ON t2.ID_T = s2.ID_T
         WHERE t2.ID_Ti = t.ID_Ti AND t2.DATE <= t.DATE)
        /
        -- 子查询2:同ID_Ti且日期<=当前行的FSOF_1总和
        (SELECT SUM(s2.FSOF_1) 
         FROM tblTourns_atp t2 
         INNER JOIN stat_atp s2 ON t2.ID_T = s2.ID_T
         WHERE t2.ID_Ti = t.ID_Ti AND t2.DATE <= t.DATE) * 100,
        0
    ) AS OUTPUT
FROM tblTourns_atp t
INNER JOIN stat_atp s ON t.ID_T = s.ID_T
ORDER BY t.ID_Ti, t.DATE;

关键说明:

  • 两个子查询里的WHERE分别关联了外部查询的t.ID_Ti和t.DATE,确保只计算当前行所在分组内、日期不晚于当前行的记录总和。
  • 用ROUND()函数把百分比保留到整数位,和你给出的示例输出格式一致。

方案二:使用窗口函数(更高效,无需额外WHERE)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这种方法性能更好,不需要写嵌套的子查询,直接通过窗口的分区和排序实现累计计算:

SELECT
    t.ID_T,
    t.ID_Ti,
    t.DATE,
    ROUND(
        -- 按ID_Ti分组,按日期排序,累计计算FS_1总和
        SUM(s.FS_1) OVER (PARTITION BY t.ID_Ti ORDER BY t.DATE)
        /
        -- 同样的窗口范围,累计计算FSOF_1总和
        SUM(s.FSOF_1) OVER (PARTITION BY t.ID_Ti ORDER BY t.DATE) * 100,
        0
    ) AS OUTPUT
FROM tblTourns_atp t
INNER JOIN stat_atp s ON t.ID_T = s.ID_T
ORDER BY t.ID_Ti, t.DATE;

关键说明:

  • PARTITION BY t.ID_Ti表示按ID_Ti分组计算,ORDER BY t.DATE让窗口函数默认从分组的第一条记录累计到当前行(等价于ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),自动实现了“日期<=当前行”的筛选逻辑,不需要额外写WHERE。

这两种方法都能得到你示例中的OUTPUT结果,你可以根据自己的数据库版本和数据量选择合适的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:23:36