Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak tworzyć dynamiczne tabele przestawne w MySQL

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zamienić część ciągu w MySQL

  2. SQL Buddy — internetowe narzędzie administracyjne MySQL

  3. ADDDATE() Przykłady – MySQL

  4. Funkcja MySQL CEILING() — zaokrąglanie w górę do najbliższej liczby całkowitej

  5. MySQL:Włącz LOAD DATA LOCAL INFILE