Để chuyển giá trị của một cột thành tên cột trong kết quả (pivot table), sử dụng CASE kết hợp MAX() và GROUP BY.
Cú pháp
SELECT cot_id,
MAX(CASE WHEN cot_gia_tri = 'gia_tri_1' THEN cot_du_lieu END) AS 'gia_tri_1',
MAX(CASE WHEN cot_gia_tri = 'gia_tri_2' THEN cot_du_lieu END) AS 'gia_tri_2',
...
FROM ten_bang
GROUP BY cot_id
ORDER BY cot_id;
Ví dụ minh họa
Tạo bảng dữ liệu thô (long format):
mysql> CREATE TABLE valueAsColumn (
-> UserId INT,
-> UserColumn1 VARCHAR(10),
-> UserColumn2 VARCHAR(10)
-> );
mysql> INSERT INTO valueAsColumn VALUES(0, 'John', 'A+');
mysql> INSERT INTO valueAsColumn VALUES(0, 'Carol', 'B');
mysql> INSERT INTO valueAsColumn VALUES(0, 'Sam', 'C');
mysql> INSERT INTO valueAsColumn VALUES(1, 'John', 'D');
mysql> INSERT INTO valueAsColumn VALUES(1, 'Carol', 'A');
mysql> INSERT INTO valueAsColumn VALUES(1, 'Carol', 'C');
Dữ liệu gốc (6 hàng):
+--------+-------------+-------------+ | UserId | UserColumn1 | UserColumn2 | +--------+-------------+-------------+ | 0 | John | A+ | | 0 | Carol | B | | 0 | Sam | C | | 1 | John | D | | 1 | Carol | A | | 1 | Carol | C | +--------+-------------+-------------+
Pivot: UserColumn1 thành tên cột, UserColumn2 thành giá trị:
mysql> SELECT UserId,
-> MAX(CASE WHEN UserColumn1 = 'John' THEN UserColumn2 END) AS 'John',
-> MAX(CASE WHEN UserColumn1 = 'Carol' THEN UserColumn2 END) AS 'Carol',
-> MAX(CASE WHEN UserColumn1 = 'Sam' THEN UserColumn2 END) AS 'Sam'
-> FROM valueAsColumn
-> GROUP BY UserId
-> ORDER BY UserId;
Kết quả (wide format - 2 hàng):
+--------+------+-------+------+ | UserId | John | Carol | Sam | +--------+------+-------+------+ | 0 | A+ | B | C | | 1 | D | C | NULL | +--------+------+-------+------+
Lưu ý: Nếu một (UserId, UserColumn1) có nhiều giá trị UserColumn2, MAX() sẽ lấy giá trị lớn nhất (theo thứ tự alphanumeric). Để lấy giá trị đầu tiên, cần kỹ thuật phức tạp hơn.