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

Как да показвате стойностите на редове като колони в MySQL

Понякога може да се наложи да транспонирате редове в колони или да създадете централни таблици за целите на отчитането. Тъй като няма вградена функция за постигане на въртене в MySQL, трябва да го постигнете чрез SQL заявка, за да създадете таблица за въртящ се отчет. Нека видим как да показваме стойностите на редовете като колони в 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    |
+------------+-------------+-------------+-------------+

Показване на стойностите на редове като колони в MySQL

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

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

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

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

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

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

  2. Как да форматирате числа със запетаи в MySQL

  3. MySQL – Функция FOUND_ROWS() за общия брой засегнати редове

  4. Използване на MySQL релационни бази данни на Gentoo

  5. Изберете последните N реда от MySQL