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

Как да създадете динамични обобщени таблици в MySQL

Осигурените таблици улесняват анализирането на големи обеми данни чрез организиране на информация в по-малък, управляем набор от данни. Въпреки това, няма вградена функция за постигане на въртене в MySQL. Трябва да напишем SQL заявка за преобразуване на ред в колона в MySQL и след това да създадем централен отчет в MySQL. Така че нека да разгледаме как да създадем динамични централни таблици в MySQL.

Как да създадете динамични обобщени таблици в MySQL

Ако искате да създадете централна таблица в MySQL, обикновено използвате оператори IF/CASE. Този подход обаче работи само когато вече знаете всички колони, които трябва да създадете в обобщена таблица.

Как създавате динамични централни таблици в MySQL, когато не знаете колоните, които да бъдат създадени, или ако очаквате те да се променят с течение на времето? В такива случаи използваме GROUP_CONCAT функция.

Да приемем, че имате следната таблица

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

Създаване на динамични обобщени таблици в MySQL

Ако вече знаете кои колони да създадете в осевната таблица, можете да използвате оператор CASE, за да създадете обобщена таблица. Въпреки това, за да създадем динамични централни таблици в MySQL, ние използваме 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 ви позволява да конкатенирате стойности от множество редове в един низ. В горната заявка използваме 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.

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

Знаете ли, че можете да създавате динамични централни таблици в Ubiq, без да пишете SQL?

Между другото, ако искате да създадете централни таблици, диаграми и табла за управление от 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

  2. Принудително InnoDB да проверява отново външни ключове на таблица/таблици?

  3. Мога ли да смесвам MySQL API в PHP?

  4. Ръководство за проектиране на база данни за система за управление на инвентара в MySQL

  5. MAX() срещу GREATEST() в MySQL:Каква е разликата?