Tôi không chắc liệu tôi có khuyên bạn nên sử dụng giải pháp này hay không ... chuẩn hóa dữ liệu của bạn luôn là lựa chọn tốt hơn, nhưng tôi muốn trả lời bằng cách sử dụng SQL thuần túy với một số hàm chuỗi. Truy vấn này sẽ trả về những gì bạn đang tìm kiếm:
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
Tôi đang nối tất cả các giá trị trong một chuỗi được phân tách bằng dấu phẩy, với hai dấu phẩy ở cuối chuỗi (dù sao thì một dấu phẩy là đủ, nhưng sẽ dễ dàng hơn nếu đặt hai và chỉ bỏ qua dấu cuối cùng ...), và vì tôi ' m sử dụng CONCAT_WS nó sẽ tự động bỏ qua các giá trị null và chuỗi kết quả sẽ giống như Aug-12,Jun-12,Apr-12,,
.
Sau đó, trong truy vấn bên ngoài, tôi đang trích xuất phần tử thứ n của chuỗi, bằng cách sử dụng SUBSTRIG_INDEX. Tôi khuyên bạn nên bình thường hóa cơ sở dữ liệu của mình, nhưng nếu bạn cần sửa nhanh, giải pháp này có thể là một điểm khởi đầu tốt.
Xem nó hoạt động tại đây .
Xin lưu ý rằng tôi không trả về giá trị NULL mà không có thay đổi nào, nhưng thay vào đó tôi trả về các chuỗi trống. Điều này có thể được thay đổi nếu bạn cần.