Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как сгруппировать динамическую сводную таблицу в sql?

ПрограммированиеData science+3
Анонимный вопрос
Data Science
  · 2,5 K
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, ' 
    '>                   FROM Meeting 
    '>                    GROUP BY Meeting_id');
Query OK, 0 rows affected (0,00 sec)
mysql> PREPARE stmt FROM @sql;
Query OK, 0 rows affected (0,00 sec)
Statement prepared
mysql> EXECUTE stmt;
+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+
2 rows in set (0,00 sec)
mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0,00 sec)