Użyj coalesce()
i podzapytanie
select id, o1,
CASE WHEN o2!=o1 THEN o2 END o2,
CASE WHEN o3!=o2 THEN o3 END o3
FROM
( select id, coalesce(org1,org2,org3) o1,
coalesce(org2,org3) o2,
org3 o3 from tbl ) t
AKTUALIZUJ
Poprzednia odpowiedź nie była wystarczająca, o czym całkiem słusznie dowiedział się R2D2. Niestety nie możesz wykonywać CTE w mysql, więc zamiast tego stworzyłem widok (rozszerzyłem przykład o kolejną kolumnę org4
):
CREATE VIEW vert AS
select id i,1 n, org1 org FROM tbl where org1>'' UNION ALL
select id,2, org2 FROM tbl where org2>'' UNION ALL
select id,3, org3 FROM tbl where org3>'' UNION ALL
select id,4, org4 FROM tbl where org4>'';
W tym widoku można teraz wykonać następujące czynności:
SELECT id,
(select org from vert where i=id order by n limit 1) org1,
(select org from vert where i=id order by n limit 1,1) org2,
(select org from vert where i=id order by n limit 2,1) org3,
(select org from vert where i=id order by n limit 3,1) org4
FROM tbl
Niezbyt piękne, ale spełnia swoje zadanie, zobacz tutaj:SQLfiddle
wejście:
| id | org1 | org2 | org3 | org4 |
|----|--------|--------|---------|--------|
| 1 | HR | (null) | Staff | IT |
| 2 | (null) | IT | Dev | (null) |
| 3 | (null) | (null) | Finance | HR |
wyjście:
| id | org1 | org2 | org3 | org4 |
|----|---------|-------|--------|--------|
| 1 | HR | Staff | IT | (null) |
| 2 | IT | Dev | (null) | (null) |
| 3 | Finance | HR | (null) | (null) |