如何将多行数据Pivot到已有列,实现单用户单行展示?
问题描述
现有如下多行数据:
| id | user | manager_id | manager_name | hierarchy | level_1 | level_2 | level_3 | level_4 |
|---|---|---|---|---|---|---|---|---|
| 100 | A | 30 | peter | 1 | brian | null | null | null |
| 100 | A | null | null | 2 | null | koby | null | null |
| 100 | A | null | null | 3 | null | null | peter | null |
| 200 | B | 20 | koby | 1 | null | brian | null | null |
| 200 | B | null | null | 2 | peter | null | null | null |
| 200 | B | null | null | 3 | null | null | koby | null |
| 300 | C | 10 | brian | 1 | peter | null | null | null |
| 300 | C | null | null | 2 | null | koby | null | null |
| 300 | C | null | null | 3 | null | null | brian | null |
需要将这些数据透视合并,实现每个用户仅保留一行,得到如下结果:
| id | user | manager_id | manager_name | hierarchy | level_1 | level_2 | level_3 | level_4 |
|---|---|---|---|---|---|---|---|---|
| 100 | A | 30 | peter | 4 | brian | koby | peter | null |
| 200 | B | 20 | koby | 4 | peter | brian | koby | null |
| 300 | C | 10 | brian | 4 | peter | koby | brian | null |
注:每个用户的每个level仅对应一个值。
解决方案
利用分组聚合即可实现需求,因为每个分组(按id和user)内的各字段仅存在一个非null值,使用聚合函数可以自动忽略null并提取有效数据:
SELECT id, user, MAX(manager_id) AS manager_id, MAX(manager_name) AS manager_name, 4 AS hierarchy, MAX(level_1) AS level_1, MAX(level_2) AS level_2, MAX(level_3) AS level_3, MAX(level_4) AS level_4 FROM your_table_name GROUP BY id, user;
逻辑说明:
- 分组依据:按
id和user分组,确保每个用户对应唯一分组; - 聚合字段:
MAX()函数会忽略null值,提取分组内唯一的非null数据,适用于manager_id、manager_name及所有level_*字段; - 固定字段:
hierarchy统一设为4,直接赋值即可。
内容的提问来源于stack exchange,提问作者usr367
相关产品推荐
相关产品推荐

