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

PostgreSQL多表关联统计查询需求:生成指定统计结果集

完善后的PostgreSQL查询语句

嘿,我来帮你搞定这个统计查询!结合你的需求,我把完整的SQL语句写出来,再一步步给你解释细节:

SELECT
    t1.code,
    t2.name,
    -- 统计date1非空的记录数
    COUNT(CASE WHEN t1.date1 IS NOT NULL THEN 1 END) AS withdate,
    -- 统计status=1的记录数
    COUNT(CASE WHEN t1.status = 1 THEN 1 END) AS type1,
    -- 统计status=2的记录数(如果你的type2对应其他status值,直接改这里的条件就行)
    COUNT(CASE WHEN t1.status = 2 THEN 1 END) AS type2
FROM
    table1 t1
-- 关联表2获取code对应的name,用LEFT JOIN保留表1所有code(哪怕表2没匹配)
LEFT JOIN
    table2 t2 ON t1.code = t2.Code
-- 按code和name分组(假设表2的Code是唯一键,name和code一一对应)
GROUP BY
    t1.code, t2.name
-- 可选:按code排序,让结果更规整
ORDER BY
    t1.code;

关键细节说明:

  • 条件统计:用COUNT(CASE ...)实现精准的条件计数,因为当CASE不满足条件时会返回NULL,而COUNT函数会自动忽略NULL值,刚好统计符合要求的记录数。
  • 表关联:这里用LEFT JOIN是为了保留表1中所有的code记录,哪怕表2里没有对应的Code(此时name会显示为NULL)。如果只需要保留表1和表2都存在的code,把LEFT JOIN换成INNER JOIN就行。
  • 分组逻辑:因为我们需要按code分组统计,而name和code是一一对应的(假设表2的Code是主键或唯一约束),所以把t2.name也加到GROUP BY里是安全的。

调整建议:

  • 如果你的type2对应的是其他status值(比如status=0),直接修改CASE WHEN t1.status = 2里的数字即可。
  • 如果需要过滤特定时间范围的记录,可以在FROM和LEFT JOIN之间加WHERE子句,比如WHERE t1.date1 BETWEEN '2023-01-01' AND '2023-12-31'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:53