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

Jak wyświetlić wartości wierszy jako kolumny w MySQL?

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP:wiele zapytań SQL w jednej instrukcji mysql_query

  2. Składnia bazy danych SQL DROP — wymienione przez DBMS

  3. właściwa składnia do użycia w pobliżu „?”

  4. Pięć najlepszych aplikacji umożliwiających dostęp do serwerów MySQL/MariaDB

  5. Testowanie wydajności za pomocą MySQLdump i narzędzia powłoki MySQL