Понякога може да се наложи да транспонирате редове в колони или да създадете централни таблици за целите на отчитането. Тъй като няма вградена функция за постигане на въртене в MySQL, трябва да го постигнете чрез SQL заявка, за да създадете таблица за въртящ се отчет. Нека видим как да показваме стойностите на редовете като колони в MySQL.
Как да се показват стойностите на редове като колони в MySQL
Да приемем, че имате следната таблица.
CREATE TABLE Meeting ( ID INT, Meeting_id INT, field_key VARCHAR(100), field_value VARCHAR(100) ); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (1, 1,'first_name' , 'Alec'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (2, 1,'last_name' , 'Jones'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (3, 1,'occupation' , 'engineer'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (4,2,'first_name' , 'John'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (5,2,'last_name' , 'Doe'); INSERT INTO Meeting(ID,Meeting_id,field_key,field_value) VALUES (6,2,'occupation' , 'engineer'); +------+------------+------------+-------------+ | 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 | +------+------------+------------+-------------+
Да приемем, че искате да транспонирате редове в колони динамично, така че да се създаде нова колона за всяка уникална стойност в field_key колона, това е (първо_име, фамилия, професия)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Показване на стойностите на редове като колони в MySQL
Ако вече знаете кои колони искате да създадете, можете да създадете централна таблица с помощта на оператори CASE, както е показано по-долу, за да покажете стойностите на редовете като колони в MySQL.
mysql> select meeting_Id, max(case when (field_key='first_name') then field_value else NULL end) as 'first_name', max(case when (field_key='last_name') then field_value else NULL end) as 'last_name', max(case when (field_key='occupation') then field_value else NULL end) as 'occupation' from meeting group by meeting_Id order by meeting_Id; +------------+------------+-----------+------------+ | meeting_Id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Динамично показване на стойностите на редове като колони в MySQL
Ако не знаете предварително имената на колоните или искате да показвате динамично стойностите на редовете като колони в MySQL, можете да създадете динамични централни таблици в MySQL с помощта на функцията GROUP_CONCAT, както е показано по-долу.
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when field_key = ''', field_key, ''' then field_value end) ', field_key ) ) INTO @sql FROM Meeting; SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting GROUP BY Meeting_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
GROUP_CONCAT ви позволява да обединявате стойности на field_key от множество редове в един низ. В горната заявка използваме GROUP_CONCAT за динамично създаване на CASE изрази въз основа на уникалните стойности в field_key колона и съхранявайте този низ в променлива @sql, която след това се използва за създаване на нашата заявка за избор.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
Можете да персонализирате горната заявка според вашите изисквания, като добавите клауза WHERE или JOINS.
Ако искате да транспонирате само избрани стойности на редове като колони, можете да добавите клауза WHERE във вашия 1-ви оператор за избор GROUP_CONCAT.
SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when field_key = ''', field_key, ''' then field_value end) ', field_key ) ) INTO @sql FROM Meeting WHERE <condition>;
Ако искате да филтрирате редове в крайната си обобщена таблица, можете да добавите клаузата WHERE във вашия оператор SET.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting WHERE <condition> GROUP BY Meeting_id');
По същия начин можете да приложите JOINS във вашата SQL заявка, докато показвате стойностите на редовете като колони в MySQL.
След като преобразувате ред в колона в MySQL, можете да използвате инструмент за диаграми, за да начертаете резултата в таблица. Ето пример за централна таблица, създадена с Ubiq.
Ако искате да създадете централни таблици, диаграми и табла за управление от MySQL база данни, можете да опитате Ubiq. Предлагаме 14-дневен безплатен пробен период.