Puedes hacer esto con substring_index()
. La siguiente consulta usa la suya como una subconsulta y luego aplica esta lógica:
select Name, ISOCode_2,
substring_index(currencies, ',', 1) as Currency1,
(case when numc >= 2 then substring_index(substring_index(currencies, ',', 2), ',', -1) end) as Currency2,
(case when numc >= 3 then substring_index(substring_index(currencies, ',', 3), ',', -1) end) as Currency3,
(case when numc >= 4 then substring_index(substring_index(currencies, ',', 4), ',', -1) end) as Currency4,
(case when numc >= 5 then substring_index(substring_index(currencies, ',', 5), ',', -1) end) as Currency5,
(case when numc >= 6 then substring_index(substring_index(currencies, ',', 6), ',', -1) end) as Currency6,
(case when numc >= 7 then substring_index(substring_index(currencies, ',', 7), ',', -1) end) as Currency7,
(case when numc >= 8 then substring_index(substring_index(currencies, ',', 8), ',', -1) end) as Currency8
from (SELECT country.Name, country.ISOCode_2, group_concat(currency.name) AS currencies,
count(*) as numc
FROM country
INNER JOIN countryCurrency ON country.country_id = countryCurrency.country_id
INNER JOIN currency ON currency.currency_id = countryCurrency.currency_id
GROUP BY country.name
) t
La expresión substring_index(currencies, ',' 2)
lleva la lista en monedas hasta la segunda. Para American Somoa, sería 'US Dollar,Kwanza'
. La siguiente llamada con -1
ya que el argumento toma el último elemento de la lista, que sería 'Kwanza'
, que es el segundo elemento de currencies
.
También tenga en cuenta que las consultas SQL devuelven un conjunto de columnas bien definido. Una consulta no puede tener un número variable de columnas (a menos que esté usando SQL dinámico a través de un prepare
declaración).