Openstack DevOps and IBM/Informix Certified DBA . Phd in Math (Duality of spaces of... · 20 сент 2022
Подход для MySQL 8.0.30 on Ubuntu 22.04.1
Допустим, вы хотите создать динамическую сводную таблицу, чтобы новый столбец создавался для каждого уникального значения в столбце field_key, то есть (имя, фамилия, род занятий). Если вы уже знаете, какие столбцы создавать в сводной таблице, вы можете использовать оператор CASE для создания сводной таблицы. Однако для создания динамических сводных таблиц в MySQL мы используем функцию GROUP_CONCAT для динамического переноса строк в столбцы, как показано ниже.
mysql> select * from Meeting;
+------+------------+------------+-------------+
| ID | Meeting_id | field_key | field_value |
+------+------------+------------+-------------+
| 1 | 1 | first_name | Alec |
| 2 | 1 | last_name | Jones |
| 3 | 1 | occupation | engineer |
| 4 | 2 | first_name | John |
| 5 | 2 | last_name | Doe |
| 6 | 2 | occupation | engineer |
+------+------------+------------+-------------+
6 rows in set (0,00 sec)
GROUP_CONCAT позволяет объединять значения из нескольких строк в одну строку. В приведенном ниже запросе мы используем GROUP_CONCAT для динамического создания операторов CASE на основе уникальных значений в столбце field_key и сохранения этой строки в переменной @sql. Затем он используется для создания нашего запроса на выборку.
mysql> SET @sql = NULL;
Query OK, 0 rows affected (0,00 sec)
mysql> SELECT
-> GROUP_CONCAT(DISTINCT
-> CONCAT(
-> 'max(case when field_key = ''',
-> field_key,
-> ''' then field_value end) ',
-> field_key
-> )
-> ) INTO @sql
-> FROM
-> Meeting;
Query OK, 1 row affected (0,00 sec)
mysql> SET @sql = CONCAT('SELECT Meeting_id, ', @sql, '