Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL GROUP_CONCAT dividido em colunas diferentes


Você pode fazer isso com substring_index() . A consulta a seguir usa a sua como uma subconsulta e aplica essa 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

A expressão substring_index(currencies, ',' 2) leva a lista em moedas até a segunda. Para American Somoa, isso seria 'US Dollar,Kwanza' . A próxima chamada com -1 pois o argumento pega o último elemento da lista, que seria 'Kwanza' , que é o segundo elemento de currencies .

Observe também que as consultas SQL retornam um conjunto de colunas bem definido. Uma consulta não pode ter um número variável de colunas (a menos que você esteja usando SQL dinâmico por meio de um prepare declaração).