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

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');

思路说明

  1. 关联逻辑:

    • 先通过usages的customer_number关联v_reporting_cids,拿到对应的customer_id
    • 再用customer_id关联v_reporting_customer_dunnings,同时加上年月匹配条件:把usages.datetime和d.dunning_dt都转成YYYYMM格式,确保匹配同一个月份的记录
  2. 字段生成:

    • dunning列:通过判断关联后的d.customer是否非空,来标记当月是否有催缴
    • dunning_level列:直接取关联到的d.dunning_lv,如果没有匹配的催缴记录,自然会返回NULL

验证示例数据

用你提供的示例数据运行这个查询,会完全符合你的预期结果:

IDDatetimeMonthCustomer_IDCIDDunningDunning_Level
113064155732019-09-01201909203914529580035006NULLNULL
82088104392018-12-01201812203914529580035006NULLNULL
79265699692018-11-01201811203914529580035006yesLEVEL 10
76546698682018-10-01201810203914529580035006NULLNULL

这里只有2018年11月的记录匹配到了v_reporting_customer_dunnings中dunning_dt为2018-11-16的那条数据,所以对应的dunning是yes,dunning_level是LEVEL 10,其他月份没有匹配的催缴记录,字段值自然为NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:50:32