Để chuyển đổi từ **rộng (wide)** – nhiều cột trên một hàng – sang **dài (long)** – một cột, nhiều hàng, dùng UNION ALL kết hợp các SELECT trên từng cột.
Cú pháp
SELECT cot_1 AS ten_cot_moi FROM ten_bang UNION ALL SELECT cot_2 FROM ten_bang UNION ALL SELECT cot_3 FROM ten_bang ...;
UNION ALL: giữ trùng lặp, nhanh hơnUNION(loại trùng).- Số cột và kiểu dữ liệu các SELECT phải khớp.
Ví dụ minh họa
mysql> CREATE TABLE DemoTable (Value1 INT, Value2 INT); mysql> INSERT INTO DemoTable VALUES (100,200), (500,600);
Gộp Value1 và Value2 thành một cột:
mysql> SELECT Value1 FROM DemoTable
-> UNION ALL
-> SELECT Value2 FROM DemoTable;
Kết quả (4 hàng):
+--------+ | Value1 | +--------+ | 100 | | 500 | | 200 | | 600 | +--------+
Mở rộng: Thêm cột nhận diện nguồn
SELECT 'Value1' AS source, Value1 AS val FROM DemoTable UNION ALL SELECT 'Value2', Value2 FROM DemoTable;
Kết quả:
+--------+------+ | source | val | +--------+------+ | Value1 | 100 | | Value1 | 500 | | Value2 | 200 | | Value2 | 600 | +--------+------+
So sánh với UNPIVOT (SQL Server/Oracle)
MySQL không có UNPIVOT. UNION ALL là cách tiêu chuẩn. MySQL 8.0+ có thể dùng LATERAL JOIN hoặc JSON_TABLE cho động hơn.
Ứng dụng
- Chuẩn hóa dữ liệu báo cáo (wide → long).
- Chuẩn bị dữ liệu cho biểu đồ (mỗi hàng = một điểm dữ liệu).
- ETL: chuyển ma trận thành danh sách.