首页 > 解决方案 > 根据值选择具有不同别名的列

问题描述

我有一张员工数据表和一张他的文件。如果文档类型为“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

我怎样才能做到这一点?

标签: sqlsql-serverdatabase

解决方案


使用聚合。如果每个 仅一个值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_iddoc_noGROUP BY.

否则,您可能想要使用string_agg()而不是max().


推荐阅读