SQL行转列:按医生+病例号分组实现单行展示操作记录
修正行转列SQL语句实现医生+病例号分组单行记录
原表数据(Doctors_Table)
| 医生 | Case_Number | 操作类型 |
|---|---|---|
| Brian | 2234 | Injection |
| Brian | 2234 | Surgery |
| Flor | 2234 | Surgery |
| Flor | 2234 | Discharge |
| Brian | 1156 | Injection |
| Brian | 3459 | Surgery |
| Flor | 3459 | Surgery |
| Brian | 3459 | H-Test |
需求说明
按Doctor+Case_Number分组生成单行记录,将所有Field类型转为列,对应操作存在标记X,不存在则为空,期望输出如下:
| 医生 | Case_Number | Injection | Surgery | H_Test | Discharge |
|---|---|---|---|---|---|
| Brian | 2234 | X | X | ||
| Flor | 2234 | X | X | ||
| Brian | 1156 | X | |||
| Brian | 3459 | X | X | ||
| Flor | 3459 | X |
错误的SQL及问题
以下SQL返回了医生+病例号对应的多行记录,不符合需求:
SELECT doctor, case_number, CASE WHEN field = 'Injection' THEN 'X' ELSE ' ' END AS INJECTION, CASE WHEN field = 'Surgery' THEN 'X' ELSE ' ' END AS Surgery, CASE WHEN field = 'H-Test' THEN 'X' ELSE ' ' END AS H-Test, CASE WHEN field = 'Discharge' THEN 'X' ELSE ' ' END AS Discharge FROM Doctors_Table GROUP BY doctor, case_number, CASE WHEN field = 'Injection' THEN 'X' ELSE ' ' END, CASE WHEN field = 'Surgery' THEN 'X' ELSE ' ' END, CASE WHEN field = 'H-Test' THEN 'X' ELSE ' ' END, CASE WHEN field = 'Discharge' THEN 'X' ELSE ' ' END
错误结果:
| 医生 | Case_Number | Injection | Surgery | H_Test | Discharge |
|---|---|---|---|---|---|
| Brian | 2234 | X | |||
| Brian | 2234 | X | |||
| Flor | 2234 | X | |||
| Flor | 2234 | X | |||
| Brian | 1156 | X | |||
| Brian | 3459 | X | |||
| Brian | 3459 | X | |||
| Flor | 3459 | X |
修正后的SQL
问题出在分组条件里包含了每个CASE表达式,导致同一医生+病例号下不同操作类型被分成了多行。需要用聚合函数合并同一分组内的结果,同时分组只保留doctor和case_number:
SELECT doctor, case_number, MAX(CASE WHEN field = 'Injection' THEN 'X' END) AS Injection, MAX(CASE WHEN field = 'Surgery' THEN 'X' END) AS Surgery, MAX(CASE WHEN field = 'H-Test' THEN 'X' END) AS H_Test, MAX(CASE WHEN field = 'Discharge' THEN 'X' END) AS Discharge FROM Doctors_Table GROUP BY doctor, case_number ORDER BY case_number, doctor;
说明
- 使用
MAX聚合函数:对于同一doctor+case_number分组,只要存在对应的操作类型,MAX会保留X,不存在则返回NULL(对应空值)。 - 移除分组条件中多余的CASE表达式:仅按
doctor和case_number分组,确保每组只生成一行记录。 - 可选的
ORDER BY子句:让结果按病例号和医生排序,与期望输出一致。
内容的提问来源于stack exchange,提问作者KapSht
相关产品推荐
相关产品推荐

