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

基于其他表日期条件的SQL求和实现方案咨询

SQL:基于关联表日期条件计算付款金额求和

我想知道SQL是否支持基于日期条件的求和计算,目前遇到的问题是所需的过滤日期需要从另一张关联表中获取。

现有可运行代码

SELECT p.first_name, p.last_name, p.customer_id, SUM(p.amount) 
FROM payment p, customer c 
WHERE c.customer_id = p.customer_id 
GROUP BY 1 
ORDER BY 4 DESC

表结构详情

Payment 表

Payment IDCustomer_IDFirst_NameLast_NameAmountPayment Date
11ABC1$102018-01-01
21ABC1$202018-02-01
31ABC1$302018-03-01
42ABC2$402018-04-01
52ABC2$502018-05-01
63ABC3$602018-06-01
73ABC3$702018-07-01

Customer 表

Customer_IDCall Date
12018-02-01
22018-05-01
32018-07-01

需求说明

查询时获取Customer表中的Call Date,并求和该日期之前(含该日期)的付款金额。


解决方案

当然SQL完全支持这种场景!你只需要在关联两张表的基础上,添加日期过滤条件,确保只统计Payment Date小于等于对应客户Call Date的记录,再分组求和即可。

优化后的SQL代码如下:

SELECT 
    p.first_name, 
    p.last_name, 
    p.customer_id, 
    c.call_date,
    SUM(p.amount) AS total_amount_before_call_date
FROM payment p
INNER JOIN customer c 
    ON p.customer_id = c.customer_id
WHERE p.payment_date <= c.call_date
GROUP BY p.first_name, p.last_name, p.customer_id, c.call_date
ORDER BY total_amount_before_call_date DESC;

代码细节说明

  • 改用INNER JOIN替代旧的隐式连接语法,代码可读性更强,是现代SQL的推荐写法
  • 添加WHERE p.payment_date <= c.call_date条件,精准筛选每个客户呼叫日期之前(含当日)的付款记录
  • 在GROUP BY中包含c.call_date,确保每个客户的呼叫日期和对应求和结果正确关联
  • 给求和字段起别名total_amount_before_call_date,让查询结果更直观

执行这段代码后,你会得到如下结果:

first_namelast_namecustomer_idcall_datetotal_amount_before_call_date
ABC332018-07-01130
ABC222018-05-0190
ABC112018-02-0130

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:04:48