PostgreSQL中CASE表达式子查询问题:关联催缴层级查询
解决PostgreSQL中匹配月度催缴层级的问题
首先,你原来的查询用IN子查询只能判断客户当月是否有催缴记录,但没法获取具体的催缴层级。更好的方式是通过LEFT JOIN关联相关表,直接匹配对应月份的催缴信息,这样既能判断是否存在催缴,也能拿到层级值。
优化后的SQL查询
SELECT u.id, u.datetime, to_char(u.datetime, 'YYYYMM') AS "month", u.customer_id, u.customer_number AS CID, -- 判断是否有匹配的催缴记录 CASE WHEN d.customer IS NOT NULL THEN 'yes' ELSE NULL END AS dunning, -- 直接获取对应月份的催缴层级,无匹配则为NULL d.dunning_lv AS dunning_level FROM usages u LEFT JOIN v_reporting_cids c ON u.customer_number = c.customer_number LEFT JOIN v_reporting_customer_dunnings d ON c.customer_id = d.customer AND to_char(u.datetime, 'YYYYMM') = to_char(d.dunning_dt, 'YYYYMM');
思路说明
关联逻辑:
- 先通过
usages的customer_number关联v_reporting_cids,拿到对应的customer_id - 再用
customer_id关联v_reporting_customer_dunnings,同时加上年月匹配条件:把usages.datetime和d.dunning_dt都转成YYYYMM格式,确保匹配同一个月份的记录
- 先通过
字段生成:
dunning列:通过判断关联后的d.customer是否非空,来标记当月是否有催缴dunning_level列:直接取关联到的d.dunning_lv,如果没有匹配的催缴记录,自然会返回NULL
验证示例数据
用你提供的示例数据运行这个查询,会完全符合你的预期结果:
| ID | Datetime | Month | Customer_ID | CID | Dunning | Dunning_Level |
|---|---|---|---|---|---|---|
| 11306415573 | 2019-09-01 | 201909 | 2039145295 | 80035006 | NULL | NULL |
| 8208810439 | 2018-12-01 | 201812 | 2039145295 | 80035006 | NULL | NULL |
| 7926569969 | 2018-11-01 | 201811 | 2039145295 | 80035006 | yes | LEVEL 10 |
| 7654669868 | 2018-10-01 | 201810 | 2039145295 | 80035006 | NULL | NULL |
这里只有2018年11月的记录匹配到了v_reporting_customer_dunnings中dunning_dt为2018-11-16的那条数据,所以对应的dunning是yes,dunning_level是LEVEL 10,其他月份没有匹配的催缴记录,字段值自然为NULL。
内容的提问来源于stack exchange,提问作者stack_underground
相关产品推荐
相关产品推荐

