Czasami Twoje dane mogą być przechowywane w wierszach i możesz chcieć je zgłosić jako kolumny. W takich przypadkach będziesz musiał transponować wiersze na kolumny. Czasami nawet te wiersze mogą być zmienne. Więc możesz wiedzieć, ile kolumn potrzebujesz. W takich przypadkach musisz dynamicznie transponować wiersze do kolumn. Ponieważ nie ma wbudowanej funkcji w MySQL, musisz to zrobić za pomocą zapytania SQL. Oto zapytanie SQL do dynamicznej transpozycji wierszy do kolumn w MySQL.
Jak dynamicznie transponować wiersze do kolumn w MySQL
Oto jak tworzyć dynamiczne tabele przestawne w MySQL. Załóżmy, że masz poniższą tabelę
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 | +------+------------+------------+-------------+
Załóżmy, że chcesz dynamicznie transponować wiersze do kolumn, tak aby dla każdej unikalnej wartości w field_key tworzona była nowa kolumna kolumna, czyli (imię, nazwisko, zawód)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Dynamicznie transponuj wiersze do kolumn
Jeśli już wiesz, które kolumny chcesz utworzyć, możesz po prostu użyć instrukcji CASE, aby utworzyć tabelę przestawną.
Ponieważ nie wiemy, które kolumny utworzyć, będziemy musieli dynamicznie transponować wiersze do kolumn za pomocą funkcji GROUP_CONCAT, jak pokazano poniżej
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 umożliwia łączenie wartości field_key z wielu wierszy w jeden ciąg. W powyższym zapytaniu używamy GROUP_CONCAT do dynamicznego tworzenia instrukcji CASE na podstawie unikalnych wartości w field_key kolumny i zapisz ten ciąg w zmiennej @sql, która jest następnie używana do tworzenia naszego zapytania wybierającego.
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
W ten sposób możesz zautomatyzować zapytania tabeli przestawnej w MySQL i dynamicznie transponować wiersze do kolumn.
Możesz dostosować powyższe zapytanie zgodnie ze swoimi wymaganiami, dodając klauzulę WHERE lub JOINS.
Jeśli chcesz transponować tylko wybrane wartości wierszy jako kolumny, możesz dodać klauzulę WHERE w swojej pierwszej instrukcji select 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>;
Jeśli chcesz filtrować wiersze w końcowej tabeli przestawnej, możesz dodać klauzulę WHERE w instrukcji SET.
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting WHERE <condition> GROUP BY Meeting_id');
Podobnie możesz również zastosować JOINS w zapytaniu SQL podczas dynamicznej transpozycji wierszy do kolumn w MySQL.
Oto przykład tabeli przestawnej utworzonej za pomocą Ubiq.
Jeśli chcesz tworzyć tabele przestawne, wykresy, dashboardy i raporty z bazy danych MySQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.