sql >> Base de Datos >  >> RDS >> Mysql

SQL GROUP_CONCAT dividido en diferentes columnas

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).