sql - 根据值选择具有不同别名的列
问题描述
我有一张员工数据表和一张他的文件。如果文档类型为“1”,则其编号应为别名“Iqama”,否则如果为“2”,则应为别名“Passport”,否则如果为“3”,则应为“驾驶执照”,依此类推。
这是我的查询:
SELECT emp_dta.emp_name,
(CASE WHEN emp_doc.doc_id_id = 1 THEN emp_doc.doc_no END) Iqama,
(CASE WHEN emp_doc.doc_id_id = 2 THEN emp_doc.doc_no END) Passport,
(CASE WHEN emp_doc.doc_id_id = 3 THEN emp_doc.doc_no END) DrivingLicence,
(CASE WHEN emp_doc.doc_id_id > 3 THEN emp_doc.doc_no END) 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, emp_doc.doc_id_id, emp_doc.doc_no
ORDER BY emp_dta.emp_name
但我得到的结果是这样的:
emp_name Iqama Passport DrivingLicence OtheDocument
Employee1 2852436985 NULL NULL NULL
Employee1 NULL EC6331777 NULL NULL
Employee1 NULL NULL 5589492385 NULL
Employee1 NULL NULL NULL 366791111
Employee2 2315492339 NULL NULL NULL
Employee2 NULL EC6331841 NULL NULL
Employee2 NULL NULL 2315492385 NULL
Employee2 NULL NULL NULL 906792486
但我的要求是得到这样的结果:
emp_name Iqama Passport DrivingLicence OtheDocument
Employee1 2852436985 EC6331777 5589492385 366791111
Employee2 2315492339 EC6331841 2315492385 906792486
我怎样才能做到这一点?
解决方案
使用聚合。如果每个 仅一个值doc_id_id
,则:
SELECT e.emp_name,
MAX(CASE WHEN ed.doc_id_id = 1 THEN ed.doc_no END) as Iqama,
MAX(CASE WHEN ed.doc_id_id = 2 THEN ed.doc_no END) as Passport,
MAX(CASE WHEN ed.doc_id_id = 3 THEN ed.doc_no END) as DrivingLicence,
MAX(CASE WHEN ed.doc_id_id > 3 THEN ed.doc_no END) as OtheDocument
FROM emp_dta d INNER JOIN
emp_doc ed
ON e.emp_id = ed.doc_emp_id
GROUP BY e.emp_id, e.emp_name
ORDER BY e.emp_name;
请注意,GROUP BY
列也发生了变化。这些定义了您想要在结果集中的每一行。所以你不想doc_id_id
或doc_no
在GROUP BY
.
否则,您可能想要使用string_agg()
而不是max()
.
推荐阅读
- javascript - 无效的 csp nonce 问题
- python - web-socket 客户端不会连接到 API
- kubernetes - 添加用户集群权限失败
- ios - 致命错误:找不到“upb/msg.h”文件(苹果 m1 芯片)
- sql-server - 添加 Windows 身份验证后 IIS / SQL Server 连接错误
- javascript - 如何在javascript中检查昨天的日期?不做一一验证
- python - 如何从每月均值屏蔽数组计算每年的总和 xarray?
- r - R中的条件过滤和数据转换;根据组和值删除行并添加其他列
- java - 多线程 JFileChooser 测试用例挂起
- angular - Angular Highcharts 动态导入不会产生额外的块