如何按文档类型设置列别名并合并同一员工的多行查询结果?
解决员工文档信息合并到同一行的SQL问题
嗨,这个问题我之前也碰到过!你现在的查询之所以会出现同一员工多行且大量NULL的情况,核心原因是GROUP BY里包含了emp_doc.doc_id_id和emp_doc.doc_no——这会让数据库把每个不同的文档类型都当成独立分组,自然每个分组里只有对应类型的文档号有值,其他字段只能返回NULL。
要实现把同一员工的所有文档合并到一行的需求,你需要用**聚合函数(比如MAX())**把每个CASE语句的结果“收拢”起来,同时调整GROUP BY的字段,只保留员工的唯一标识和姓名,不需要包含文档相关字段。
修改后的SQL查询
SELECT emp_dta.emp_name, MAX(CASE WHEN emp_doc.doc_id_id = 1 THEN emp_doc.doc_no END) AS Iqama, MAX(CASE WHEN emp_doc.doc_id_id = 2 THEN emp_doc.doc_no END) AS Passport, MAX(CASE WHEN emp_doc.doc_id_id = 3 THEN emp_doc.doc_no END) AS DrivingLicence, MAX(CASE WHEN emp_doc.doc_id_id > 3 THEN emp_doc.doc_no END) AS OtheDocument FROM emp_dta INNER JOIN emp_doc ON emp_dta.emp_id = emp_doc.doc_emp_id GROUP BY emp_dta.emp_id, emp_dta.emp_name ORDER BY emp_dta.emp_name;
为什么这样能解决问题?
MAX()函数会自动忽略NULL值,只保留每个分组(即每个员工)下对应文档类型的非NULL文档号;- GROUP BY只按
emp_id和emp_name分组,确保每个员工只会生成一行结果; - 每个CASE语句负责匹配对应的文档类型,聚合函数把同一员工的所有文档类型结果合并到同一行。
执行这个查询后,你就能得到期望的结果:同一员工的所有文档信息都在一行里展示,没有多余的NULL和分散的行。
内容的提问来源于stack exchange,提问作者Dr. MAF
相关产品推荐
相关产品推荐

