Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да транспонирате редове в колони динамично в MySQL

Понякога данните ви може да се съхраняват в редове и може да искате да ги отчетете като колони. В такива случаи ще трябва да транспонирате редове в колони. Понякога дори тези редове могат да бъдат променливи. Така че може да знаете колко колони са ви необходими. В такива случаи трябва да транспонирате редове в колони динамично. Тъй като в MySQL няма вградена функция, която да прави това, трябва да го постигнете с помощта на SQL заявка. Ето SQL заявка за динамично транспониране на редове в колони в MySQL.

Как да транспонирате редове в колони динамично в MySQL

Ето как да създадете динамични централни таблици в MySQL. Да приемем, че имате следната таблица

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    |
+------+------------+------------+-------------+

Да приемем, че искате да транспонирате редове в колони динамично, така че да се създаде нова колона за всяка уникална стойност в field_key колона, това е (първо_име, фамилия, професия)

+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+

Динамично транспониране на редове в колони

Ако вече знаете кои колони ще създавате предварително, можете просто да използвате оператор CASE, за да създадете основна таблица.

Тъй като не знаем кои колони да бъдат създадени, ще трябва динамично да транспонираме редове в колони, използвайки функцията GROUP_CONCAT, както е показано по-долу

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 ви позволява да обединявате стойности на field_key от множество редове в един низ. В горната заявка използваме GROUP_CONCAT за динамично създаване на CASE изрази въз основа на уникалните стойности в field_key колона и съхранявайте този низ в променлива @sql, която след това се използва за създаване на нашата заявка за избор.

+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Ето как можете да автоматизирате заявките за централна таблица в MySQL и динамично да транспонирате редове в колони.

Можете да персонализирате горната заявка според вашите изисквания, като добавите клауза WHERE или JOINS.

Ако искате да транспонирате само избрани стойности на редове като колони, можете да добавите клауза WHERE във вашия 1-ви оператор за избор 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>;

Ако искате да филтрирате редове в крайната си обобщена таблица, можете да добавите клаузата WHERE във вашия оператор SET.

SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting WHERE <condition>
                   GROUP BY Meeting_id');

По същия начин можете да приложите JOINS във вашата SQL заявка, докато транспонирате редове в колони динамично в MySQL.

Ето пример за централна таблица, създадена с Ubiq.

Ако искате да създавате централни таблици, диаграми, табла за управление и отчети от MySQL база данни, можете да опитате Ubiq. Предлагаме 14-дневен безплатен пробен период.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Научете MySQL / MariaDB за начинаещи – част 1

  2. JSON_STORAGE_SIZE() – Намерете размера на съхранение на JSON документ в MySQL

  3. Използвайте MySQL релационни бази данни в Ubuntu 10.10 (Maverick)

  4. MySQL връзката не работи:2002 Няма такъв файл или директория

  5. Как да инсталирате MySQL 8 на Ubuntu 20.04 LTS