Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách hiển thị giá trị hàng dưới dạng cột trong MySQL

Đôi khi, bạn có thể cần chuyển các hàng thành cột hoặc tạo bảng tổng hợp cho mục đích báo cáo. Vì không có chức năng tích hợp nào để đạt được pivot trong MySQL, bạn cần thực hiện nó thông qua truy vấn SQL để tạo bảng báo cáo pivot. Hãy xem cách hiển thị giá trị hàng dưới dạng cột trong MySQL.

Cách hiển thị giá trị hàng dưới dạng cột trong MySQL

Giả sử bạn có bảng sau.

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

Giả sử bạn muốn chuyển đổi động các hàng thành các cột, sao cho một cột mới được tạo cho mỗi giá trị duy nhất trong field_key , đó là (first_name, last_name, nghề nghiệp)

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

Hiển thị giá trị hàng dưới dạng cột trong MySQL

Nếu bạn đã biết mình muốn tạo cột nào, bạn có thể tạo bảng tổng hợp bằng cách sử dụng câu lệnh CASE, như được hiển thị bên dưới, để hiển thị giá trị hàng dưới dạng cột trong 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   |
+------------+------------+-----------+------------+

Hiển thị giá trị hàng dưới dạng cột trong MySQL động

Nếu bạn không biết trước tên cột hoặc muốn hiển thị động các giá trị hàng dưới dạng cột trong MySQL, bạn có thể tạo bảng tổng hợp động trong MySQL bằng cách sử dụng hàm GROUP_CONCAT, như được hiển thị bên dưới.

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 cho phép bạn nối các giá trị field_key từ nhiều hàng thành một chuỗi duy nhất. Trong truy vấn trên, chúng tôi sử dụng GROUP_CONCAT để tạo động các câu lệnh CASE, dựa trên các giá trị duy nhất trong field_key và lưu trữ chuỗi đó trong biến @sql, sau đó được sử dụng để tạo truy vấn đã chọn của chúng tôi.

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

Bạn có thể tùy chỉnh truy vấn trên theo yêu cầu của mình bằng cách thêm mệnh đề WHERE hoặc JOINS.

Nếu bạn chỉ muốn chuyển các giá trị hàng đã chọn thành cột, bạn có thể thêm mệnh đề WHERE trong câu lệnh GROUP_CONCAT lựa chọn đầu tiên của mình.

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting
WHERE <condition>;

Nếu bạn muốn lọc các hàng trong bảng tổng hợp cuối cùng của mình, bạn có thể thêm mệnh đề WHERE trong câu lệnh SET của mình.

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

Tương tự, bạn cũng có thể áp dụng JOINS trong truy vấn SQL của mình trong khi hiển thị các giá trị hàng dưới dạng cột trong MySQL.

Sau khi bạn chuyển đổi hàng thành cột trong MySQL, bạn có thể sử dụng công cụ biểu đồ để vẽ kết quả trong bảng. Dưới đây là ví dụ về bảng tổng hợp được tạo bằng Ubiq.

Nếu bạn muốn tạo bảng tổng hợp, biểu đồ &trang tổng quan từ cơ sở dữ liệu MySQL, bạn có thể thử Ubiq. Chúng tôi cung cấp bản dùng thử miễn phí 14 ngày.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ trả lại hàng nếu giá trị không tồn tại

  2. Bật kết nối MySQL từ xa:LỖI 1045 (28000):Quyền truy cập bị từ chối đối với người dùng

  3. Kiểm tra hiệu suất sử dụng MySQLdump và MySQL Shell Utility

  4. Sự khác biệt giữa FIELD () và FIND_IN_SET () trong MySQL

  5. Cách ClusterControl định cấu hình IP ảo và Điều gì sẽ xảy ra trong quá trình chuyển đổi dự phòng