Jag är inte säker på om jag skulle rekommendera att använda den här lösningen... normalisering av dina data är alltid ett bättre val, men jag ville svara med vanlig SQL med några strängfunktioner. Den här frågan bör returnera det du letar 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
Jag sammanfogar alla värden i en kommaseparerad sträng, med två kommatecken i slutet av strängen (ett kommatecken skulle räcka ändå, men det är lättare att sätta två och bara ignorera det sista...), och eftersom jag m med CONCAT_WS hoppar den automatiskt över nollvärden, och den resulterande strängen blir ungefär Aug-12,Jun-12,Apr-12,,
.
Sedan extraherar jag det n:te elementet i strängen i den yttre frågan med SUBSTRIG_INDEX. Jag skulle rekommendera att normalisera din databas, men om du behöver en snabb lösning kan den här lösningen vara en bra utgångspunkt.
Se hur det fungerar här .
Observera att jag inte returnerar NULL-värden där det inte finns några ändringar, utan jag returnerar tomma strängar istället. Detta kan ändras om du behöver.