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
相关产品推荐
相关产品推荐

