Nejsem si jistý, zda bych toto řešení doporučil... normalizace vašich dat je vždy lepší volbou, ale chtěl jsem odpovědět pomocí prostého SQL s některými funkcemi řetězců. Tento dotaz by měl vrátit to, co hledáte:
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
Zřetězuji všechny hodnoty do řetězce odděleného čárkami, se dvěma čárkami na konci řetězce (stejně by stačila jedna čárka, ale je jednodušší dát dvě a tu poslední prostě ignorovat...), a protože jsem' m pomocí CONCAT_WS automaticky přeskočí hodnoty null a výsledný řetězec bude něco jako Aug-12,Jun-12,Apr-12,,
.
Pak ve vnějším dotazu extrahuji n-tý prvek řetězce pomocí SUBSTRIG_INDEX. Doporučil bych normalizovat vaši databázi, ale pokud potřebujete rychlou opravu, toto řešení může být dobrým výchozím bodem.
Podívejte se, jak to funguje zde .
Všimněte si prosím, že nevracím hodnoty NULL, kde nejsou žádné změny, ale místo toho vracím prázdné řetězce. Toto lze v případě potřeby změnit.