Jeg er ikke sikker på, om jeg vil anbefale at bruge denne løsning ... normalisering af dine data er altid et bedre valg, men jeg ønskede at svare ved hjælp af almindelig SQL med nogle strenge funktioner. Denne forespørgsel skulle returnere det, du leder efter:
SELECT
Name,
Changes,
REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
FROM (
SELECT
Name,
CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
FROM
TableA
) s
Jeg sammenkæder alle værdier i en kommasepareret streng med to kommaer i slutningen af strengen (et komma ville være nok alligevel, men det er nemmere at sætte to og bare ignorere den sidste...), og da jeg' m ved brug af CONCAT_WS vil den automatisk springe nul-værdier over, og den resulterende streng vil være noget som Aug-12,Jun-12,Apr-12,,
.
Så i den ydre forespørgsel udtrækker jeg det n-te element i strengen ved hjælp af SUBSTRIG_INDEX. Jeg vil anbefale at normalisere din database, men hvis du har brug for en hurtig løsning kan denne løsning være et godt udgangspunkt.
Se det fungere her .
Bemærk venligst, at jeg ikke returnerer NULL-værdier, hvor der ikke er ændringer, men jeg returnerer tomme strenge i stedet. Dette kan ændres, hvis du har brug for det.