Tabele przestawne ułatwiają analizowanie dużych ilości danych, organizując informacje w mniejszy, łatwy do zarządzania zestaw danych. Jednak w MySQL nie ma wbudowanej funkcji umożliwiającej osiągnięcie osi obrotu. Musimy napisać zapytanie SQL, aby przekonwertować wiersz na kolumnę w MySQL, a następnie utworzyć raport przestawny w MySQL. Spójrzmy więc, jak tworzyć dynamiczne tabele przestawne w MySQL.
Jak tworzyć dynamiczne tabele przestawne w MySQL
Jeśli chcesz utworzyć tabelę przestawną w MySQL, zwykle użyjesz instrukcji IF/CASE. Jednak to podejście działa tylko wtedy, gdy znasz już wszystkie kolumny, które musisz utworzyć w tabeli przestawnej.
Jak tworzyć dynamiczne tabele przestawne w MySQL, jeśli nie wiesz, jakie kolumny mają zostać utworzone lub jeśli spodziewasz się, że będą się zmieniać w czasie? W takich przypadkach używamy GROUP_CONCAT funkcja.
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 utworzyć dynamiczną tabelę przestawną, w której dla każdej unikalnej wartości w field_key zostanie utworzona nowa kolumna kolumna, czyli (imię, nazwisko, zawód)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
Twórz dynamiczne tabele przestawne w MySQL
Jeśli już wiesz, które kolumny utworzyć w tabeli przestawnej, możesz użyć instrukcji CASE, aby utworzyć tabelę przestawną. Jednak do tworzenia dynamicznych tabel przestawnych w MySQL używamy GROUP_CONCAT funkcja do dynamicznej transpozycji wierszy do kolumn, 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 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. Jest on następnie używany 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 tabel przestawnych w MySQL.
Możesz dostosować powyższe zapytanie zgodnie ze swoimi wymaganiami, dodając klauzulę WHERE lub JOINS.
Jeśli chcesz przestawiać tylko wartości wierszy jako kolumny, możesz dodać klauzulę WHERE w swoim pierwszym wyrażeniu GROUP_CONCAT, jak pokazano w pogrubieniu poniżej
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, jak pokazano pogrubioną poniżej.
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 tworzenia dynamicznych tabel przestawnych w MySQL.
Po utworzeniu dynamicznych tabel przestawnych w MySQL możesz użyć narzędzia do raportowania, aby wykreślić je w tabeli. Oto przykład tabeli przestawnej utworzonej za pomocą Ubiq.

Czy wiesz, że możesz tworzyć dynamiczne tabele przestawne w Ubiq bez pisania kodu SQL?
Przy okazji, 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.