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 |
How to pivot the rows values to existing columns so as to retain one row for one user?
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 |
Note: Each level will have only one value for each user.
Given your premise of one single value on aggregated fields for each user, you can just use aggregation with the MAX
funtion for each non-aggregated field:
SELECT id, [user],
MAX(manager_id) AS manager_id,
MAX(manager_name) AS manager_name,
MAX(hierarchy) +1 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 tab
GROUP BY id, [user]
Check the demo here.