如何编写SQL查询指定客户多时段交易总额(返回单行)
查询指定客户多时间段交易总额
假设存在采购交易表(示例中表名可设为PurchaseTransactions),包含字段:
CustId:客户IDAmount:交易金额DatePosted:交易时间(DATETIME类型)
需编写SELECT语句,针对特定CustId返回单行结果,包含该客户的近3天、近60天、近1年、近2年交易总额。
示例交易表
| CustId | Amount | DatePosted |
|---|---|---|
| 1234 | 698.02 | 2023-01-23 12:34:56 |
| 1234 | 582.69 | 2022-12-15 19:57:23 |
| 1234 | 7775.22 | 2022-12-02 02:34:32 |
| 1234 | 18.72 | 2022-01-23 12:34:56 |
| 1234 | 2.27 | 2021-01-23 12:34:56 |
预期查询结果(CustId=1234)
| CustId | 3-day Total | 60-day Total | 1 year Total | 2 year Total |
|---|---|---|---|---|
| 1234 | 698.02 | 9055.93 | 9074.65 | 9076.92 |
解决方案
使用条件聚合实现,通过SUM()结合CASE WHEN筛选不同时间范围的交易金额,确保返回单行统计结果。
SQL语句(以SQL Server为例)
SELECT CustId, SUM(CASE WHEN DatePosted >= DATEADD(day, -3, GETDATE()) THEN Amount ELSE 0 END) AS [3-day Total], SUM(CASE WHEN DatePosted >= DATEADD(day, -60, GETDATE()) THEN Amount ELSE 0 END) AS [60-day Total], SUM(CASE WHEN DatePosted >= DATEADD(year, -1, GETDATE()) THEN Amount ELSE 0 END) AS [1 year Total], SUM(CASE WHEN DatePosted >= DATEADD(year, -2, GETDATE()) THEN Amount ELSE 0 END) AS [2 year Total] FROM PurchaseTransactions WHERE CustId = 1234 GROUP BY CustId;
不同数据库适配说明
如果使用其他数据库,需调整时间计算函数:
- MySQL:替换
DATEADD(day, -3, GETDATE())为DATE_SUB(NOW(), INTERVAL 3 DAY) - PostgreSQL:替换为
CURRENT_TIMESTAMP - INTERVAL '3 days' - Oracle:替换为
SYSDATE - 3(天数)或ADD_MONTHS(SYSDATE, -12)(年数)
逻辑说明
CASE WHEN判断交易时间是否落在目标时间范围内,符合条件则累加对应Amount,否则加0GROUP BY CustId确保结果按客户分组,最终返回单行统计数据
内容的提问来源于stack exchange,提问作者Portaljacker
相关产品推荐
相关产品推荐

