Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL GROUP_CONCAT divisé en différentes colonnes

Vous pouvez le faire avec substring_index() . La requête suivante utilise la vôtre comme sous-requête, puis applique cette logique :

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

L'expression substring_index(currencies, ',' 2) prend la liste en devises jusqu'à la seconde. Pour les somoas américains, ce serait 'US Dollar,Kwanza' . Le prochain appel avec -1 car l'argument prend le dernier élément de la liste, qui serait 'Kwanza' , qui est le deuxième élément de currencies .

Notez également que les requêtes SQL renvoient un ensemble bien défini de colonnes. Une requête ne peut pas avoir un nombre variable de colonnes (sauf si vous utilisez du SQL dynamique via un prepare déclaration).