Ich bin mir nicht sicher, ob ich die Verwendung dieser Lösung empfehlen würde ... die Normalisierung Ihrer Daten ist immer eine bessere Wahl, aber ich wollte mit einfachem SQL mit einigen Zeichenfolgenfunktionen antworten. Diese Abfrage sollte zurückgeben, wonach Sie suchen:
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
Ich verkette alle Werte in einer durch Kommas getrennten Zeichenfolge mit zwei Kommas am Ende der Zeichenfolge (ein Komma würde sowieso ausreichen, aber es ist einfacher, zwei zu setzen und das letzte einfach zu ignorieren ...), und da ich ' Wenn Sie CONCAT_WS verwenden, werden Nullwerte automatisch übersprungen, und die resultierende Zeichenfolge ist so etwas wie Aug-12,Jun-12,Apr-12,,
.
Dann extrahiere ich in der äußeren Abfrage das n-te Element der Zeichenfolge mit SUBSTRIG_INDEX. Ich würde empfehlen, Ihre Datenbank zu normalisieren, aber wenn Sie eine schnelle Lösung benötigen, könnte diese Lösung ein guter Ausgangspunkt sein.
Sehen Sie, wie es hier funktioniert .
Bitte beachten Sie, dass ich keine NULL-Werte zurückgebe, wo es keine Änderungen gibt, sondern ich gebe stattdessen leere Zeichenfolgen zurück. Dies kann bei Bedarf geändert werden.