基于其他表日期条件的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 ID | Customer_ID | First_Name | Last_Name | Amount | Payment Date |
|---|---|---|---|---|---|
| 1 | 1 | ABC | 1 | $10 | 2018-01-01 |
| 2 | 1 | ABC | 1 | $20 | 2018-02-01 |
| 3 | 1 | ABC | 1 | $30 | 2018-03-01 |
| 4 | 2 | ABC | 2 | $40 | 2018-04-01 |
| 5 | 2 | ABC | 2 | $50 | 2018-05-01 |
| 6 | 3 | ABC | 3 | $60 | 2018-06-01 |
| 7 | 3 | ABC | 3 | $70 | 2018-07-01 |
Customer 表
| Customer_ID | Call Date |
|---|---|
| 1 | 2018-02-01 |
| 2 | 2018-05-01 |
| 3 | 2018-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_name | last_name | customer_id | call_date | total_amount_before_call_date |
|---|---|---|---|---|
| ABC | 3 | 3 | 2018-07-01 | 130 |
| ABC | 2 | 2 | 2018-05-01 | 90 |
| ABC | 1 | 1 | 2018-02-01 | 30 |
内容的提问来源于stack exchange,提问作者Hasen CH
相关产品推荐
相关产品推荐

