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

Jak dynamicznie transponować wiersze do kolumn w MySQL?

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapętlanie zestawów wyników w MySQL

  2. Znajdź zduplikowane rekordy w MySQL

  3. Jak wstawić dane z jednej tabeli bazy danych do innej tabeli bazy danych w Mysql

  4. Instalacja MySQL:BŁĄD:Nie udało się zbudować natywnego rozszerzenia gem

  5. Jak utworzyć bazę danych w MySQL Workbench za pomocą GUI