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

Cách chuyển đổi hàng thành cột động trong MySQL

Đôi khi, dữ liệu của bạn có thể được lưu trữ trong các hàng và bạn có thể muốn báo cáo nó dưới dạng cột. Trong những trường hợp như vậy, bạn sẽ cần chuyển các hàng thành cột. Đôi khi, ngay cả những hàng này cũng có thể thay đổi. Vì vậy, bạn có thể biết bạn cần bao nhiêu cột. Trong những trường hợp như vậy, bạn cần tự động chuyển đổi các hàng thành các cột. Vì không có chức năng tích hợp nào để làm điều đó trong MySQL, bạn cần thực hiện nó bằng cách sử dụng truy vấn SQL. Đây là một truy vấn SQL để chuyển đổi động các hàng thành các cột trong MySQL.

Cách chuyển đổi hàng thành cột động trong MySQL

Dưới đây là cách tạo bảng tổng hợp động 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    |
+------------+-------------+-------------+-------------+

Chuyển đổi động các hàng thành các cột

Nếu bạn đã biết trước những cột nào bạn sẽ tạo, bạn có thể chỉ cần sử dụng câu lệnh CASE để tạo bảng tổng hợp.

Vì chúng tôi không biết cột nào sẽ được tạo, chúng tôi sẽ phải tự động chuyển đổi các hàng thành các cột 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   |
+------------+------------+-----------+------------+

Đây là cách bạn có thể tự động hóa các truy vấn bảng tổng hợp trong MySQL và chuyển đổi động các hàng thành cột.

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 chuyển đổi động các hàng thành cột trong MySQL.

Dưới đây là một 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 và báo cáo 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. Cài đặt Máy chủ Web trong Windows XP với Apache2, PHP5 và MySQL4 - Phần 1

  2. cách tính độ giống nhau giữa hai chuỗi trong MYSQL

  3. Thủ tục lưu trữ thay thế MySQL

  4. Tại sao tôi không nên sử dụng các hàm mysql_ * trong PHP?

  5. Hướng dẫn thiết kế cơ sở dữ liệu cho câu hỏi trong MySQL