基于USERTABLE日期筛选STOCKTABLE数据的SQL查询需求
问题说明
表结构与数据
USERTABLE(用户基准表)
包含字段:USERID(用户ID)、DATE(用户基准日期)
数据如下:
| USERID | DATE |
|---|---|
| 1 | 2022-01-01 |
| 2 | 2022-03-01 |
STOCKTABLE(交易记录表)
包含字段:USERID(用户ID)、DATE(交易日期)、VALUE(交易金额)、APPROVED(是否审批通过)
数据如下:
| USERID | DATE | VALUE | APPROVED |
|---|---|---|---|
| 1 | 2020-12-31 | 100 | Y |
| 1 | 2022-02-01 | 50 | Y |
| 1 | 2022-03-01 | 100 | N |
| 2 | 2022-01-01 | 10 | N |
| 2 | 2022-03-02 | 20 | N |
| 2 | 2022-03-05 | 25 | Y |
需求
筛选出STOCKTABLE中交易日期大于对应用户在USERTABLE中基准日期的行,按USERID分组统计两个指标:
COUNT:符合条件的交易总行数SUM:其中APPROVED为Y的交易金额总和
预期结果
| USERID | COUNT | SUM |
|---|---|---|
| 1 | 2 | 50 |
| 2 | 2 | 25 |
解决方案SQL语句
SELECT u.USERID, COUNT(s.USERID) AS COUNT, SUM(CASE WHEN s.APPROVED = 'Y' THEN s.VALUE ELSE 0 END) AS SUM FROM USERTABLE u JOIN STOCKTABLE s ON u.USERID = s.USERID WHERE s.DATE > u.DATE GROUP BY u.USERID;
语句说明
- 表关联:通过
USERID将两张表内关联,只处理存在基准日期的用户交易记录 - 条件筛选:
WHERE s.DATE > u.DATE过滤出交易日期晚于用户基准日期的记录 - 统计逻辑:
COUNT(s.USERID)直接统计符合条件的交易行数SUM(CASE...)通过条件判断,仅累加审批通过(APPROVED='Y')的交易金额,未通过的记为0不影响总和
内容的提问来源于stack exchange,提问作者FlyingPickle
相关产品推荐
相关产品推荐

