Понякога данните ви може да се съхраняват в редове и може да искате да ги отчетете като колони. В такива случаи ще трябва да транспонирате редове в колони. Понякога дори тези редове могат да бъдат променливи. Така че може да знаете колко колони са ви необходими. В такива случаи трябва да транспонирате редове в колони динамично. Тъй като в MySQL няма вградена функция, която да прави това, трябва да го постигнете с помощта на SQL заявка. Ето SQL заявка за динамично транспониране на редове в колони в MySQL.
Как да транспонирате редове в колони динамично в 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 | +------------+-------------+-------------+-------------+
Динамично транспониране на редове в колони
Ако вече знаете кои колони ще създавате предварително, можете просто да използвате оператор CASE, за да създадете основна таблица.
Тъй като не знаем кои колони да бъдат създадени, ще трябва динамично да транспонираме редове в колони, използвайки функцията 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 | +------------+------------+-----------+------------+
Ето как можете да автоматизирате заявките за централна таблица в MySQL и динамично да транспонирате редове в колони.
Можете да персонализирате горната заявка според вашите изисквания, като добавите клауза 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.
Ето пример за централна таблица, създадена с Ubiq.
Ако искате да създавате централни таблици, диаграми, табла за управление и отчети от MySQL база данни, можете да опитате Ubiq. Предлагаме 14-дневен безплатен пробен период.