sql >> Database >  >> RDS >> Mysql

Hoe kolomwaarden in MySQL verschuiven?

Gebruik coalesce() en een subquery

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

UPDATE

Het vorige antwoord was niet voldoende, zoals R2D2 terecht ontdekte. Helaas kun je geen CTE's doen in mysql, dus heb ik in plaats daarvan een weergave gemaakt (ik heb het voorbeeld uitgebreid met een andere kolom 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>'';

Met deze weergave is het nu mogelijk om het volgende te doen:

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

Niet mooi, maar het klaart de klus, zie hier:SQLfiddle

invoer:

| id |   org1 |   org2 |    org3 |   org4 |
|----|--------|--------|---------|--------|
|  1 |     HR | (null) |   Staff |     IT |
|  2 | (null) |     IT |     Dev | (null) |
|  3 | (null) | (null) | Finance |     HR |

uitgang:

| id |    org1 |  org2 |   org3 |   org4 |
|----|---------|-------|--------|--------|
|  1 |      HR | Staff |     IT | (null) |
|  2 |      IT |   Dev | (null) | (null) |
|  3 | Finance |    HR | (null) | (null) |


  1. Hoe een opgeslagen procedure in het C#-programma uit te voeren

  2. Een procedure maken in een pakket in Oracle

  3. Waarden splitsen over meerdere rijen

  4. Laravel 5 gebruikt OR-conditie met BETWEEN