Nie jestem pewien, czy polecałbym to rozwiązanie... normalizacja danych zawsze jest lepszym wyborem, ale chciałem odpowiedzieć zwykłym SQL z kilkoma funkcjami stringów. To zapytanie powinno zwrócić to, czego szukasz:
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
Łączę wszystkie wartości w ciągu oddzielonym przecinkami, z dwoma przecinkami na końcu ciągu (jeden przecinek i tak by wystarczył, ale łatwiej jest umieścić dwa i po prostu zignorować ostatni...), a ponieważ ja' m używając CONCAT_WS automatycznie pominie wartości null, a wynikowy ciąg będzie podobny do Aug-12,Jun-12,Apr-12,,
.
Następnie w zapytaniu zewnętrznym wyodrębniam n-ty element ciągu, używając SUBSTRIG_INDEX. Zalecam normalizację bazy danych, ale jeśli potrzebujesz szybkiej naprawy, to rozwiązanie może być dobrym punktem wyjścia.
Zobacz, jak działa tutaj .
Proszę zauważyć, że nie zwracam wartości NULL tam, gdzie nie ma zmian, ale zamiast tego zwracam puste ciągi. Można to zmienić w razie potrzeby.