Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL GROUP_CONCAT in verschiedene Spalten aufgeteilt

Sie können dies mit substring_index() tun . Die folgende Abfrage verwendet Ihre als Unterabfrage und wendet dann diese Logik an:

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

Der Ausdruck substring_index(currencies, ',' 2) nimmt die Liste in Währungen bis zur zweiten auf. Für American Somoa wäre das 'US Dollar,Kwanza' . Der nächste Aufruf mit -1 als Argument nimmt das letzte Element der Liste, was 'Kwanza' wäre , das zweite Element von currencies .

Beachten Sie auch, dass SQL-Abfragen einen wohldefinierten Satz von Spalten zurückgeben. Eine Abfrage kann keine variable Anzahl von Spalten haben (es sei denn, Sie verwenden dynamisches SQL über ein prepare Erklärung).