Czasami może być konieczne przetransponowanie wierszy na kolumny lub utworzenie tabel przestawnych do celów raportowania. Ponieważ w MySQL nie ma wbudowanej funkcji, aby uzyskać przestawną funkcję, musisz to zrobić za pomocą zapytania SQL, aby utworzyć tabelę raportów przestawnych. Zobaczmy, jak wyświetlić wartości wierszy jako kolumny w MySQL.
Jak wyświetlać wartości wierszy jako kolumny 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 | +------------+-------------+-------------+-------------+
Wyświetlaj wartości wierszy jako kolumny w MySQL
Jeśli już wiesz, które kolumny chcesz utworzyć, możesz utworzyć tabelę przestawną za pomocą instrukcji CASE, jak pokazano poniżej, aby wyświetlić wartości wierszy jako kolumny w 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 | +------------+------------+-----------+------------+
Dynamiczne wyświetlanie wartości wierszy jako kolumn w MySQL
Jeśli nie znasz wcześniej nazw kolumn lub chcesz dynamicznie wyświetlać wartości wierszy jako kolumny w MySQL, możesz utworzyć dynamiczne tabele przestawne w MySQL 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 | +------------+------------+-----------+------------+
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 wyświetlania wartości wierszy jako kolumn w MySQL.
Po przekonwertowaniu wiersza na kolumnę w MySQL możesz użyć narzędzia do tworzenia wykresów, aby wykreślić wynik w tabeli. Oto przykład tabeli przestawnej utworzonej za pomocą Ubiq.
Jeśli chcesz tworzyć tabele przestawne, wykresy i dashboardy z bazy danych MySQL, możesz wypróbować Ubiq. Oferujemy 14-dniowy bezpłatny okres próbny.