Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Gộp nhiều cột thành nhiều hàng trong MySQL bằng UNION ALL

Để 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ơn UNION (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.