PostgreSQL中使用全外连接实现学校数据日期列按级别拆分
解决PostgreSQL行转列(透视表)需求
这是典型的行转列场景,用条件聚合就能轻松搞定,比你尝试的UNION或循环方案更简洁高效,也更易维护。
解决方案SQL代码
SELECT sch_code, COALESCE(MAX(CASE WHEN sch_level = 'P' THEN start_date END), '00-00-0000') AS start_P, COALESCE(MAX(CASE WHEN sch_level = 'P' THEN end_date END), '00-00-0000') AS end_P, COALESCE(MAX(CASE WHEN sch_level = 'S' THEN start_date END), '00-00-0000') AS start_S, COALESCE(MAX(CASE WHEN sch_level = 'S' THEN end_date END), '00-00-0000') AS end_S FROM your_table_name -- 替换为你的实际表名 WHERE flag = 'V' -- 根据你的数据需求,可保留或移除该过滤条件 GROUP BY sch_code ORDER BY sch_code;
代码逻辑说明
- 分组聚合:通过
GROUP BY sch_code将同一代码的所有行合并到一条结果中 - 条件取值:用
CASE WHEN匹配sch_level,提取对应级别的日期;MAX函数确保每个分组内仅保留该级别唯一的日期(即使有重复行也能正确处理) - 默认值填充:
COALESCE函数会把没有对应级别数据时产生的NULL,替换成你需要的00-00-0000
执行这段SQL后,结果会完全匹配你预期的输出格式:既有同时包含P/S级别的完整数据,也会为缺失级别填充指定默认值。
内容的提问来源于stack exchange,提问作者prajakta
相关产品推荐
相关产品推荐

