Saya tidak yakin apakah saya akan merekomendasikan menggunakan solusi ini... normalisasi data Anda selalu merupakan pilihan yang lebih baik, tetapi saya ingin menjawab menggunakan SQL biasa dengan beberapa fungsi string. Kueri ini akan mengembalikan apa yang Anda cari:
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
Saya menggabungkan semua nilai dalam string yang dipisahkan koma, dengan dua koma di akhir string (satu koma akan cukup, tetapi lebih mudah untuk menempatkan dua dan mengabaikan yang terakhir ...), dan karena saya' m menggunakan CONCAT_WS itu akan secara otomatis melewati nilai nol, dan string yang dihasilkan akan menjadi seperti Aug-12,Jun-12,Apr-12,,
.
Kemudian di kueri luar saya mengekstrak elemen ke-n dari string, menggunakan SUBSTRIG_INDEX. Saya akan merekomendasikan untuk menormalkan database Anda, tetapi jika Anda memerlukan perbaikan cepat, solusi ini mungkin merupakan titik awal yang baik.
Lihat itu berfungsi di sini .
Harap perhatikan bahwa saya tidak mengembalikan nilai NULL di mana tidak ada perubahan, tetapi saya mengembalikan string kosong sebagai gantinya. Ini dapat diubah jika Anda perlu.