Đô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.