Nếu bạn có một số giá trị đã biết cho cả order
và item
, sau đó bạn có thể viết mã truy vấn thành:
select id,
max(case when `order` = 1 then data end) order1,
max(case when `order` = 2 then data end) order2,
max(case when `order` = 3 then data end) order3,
max(case when item = 1 then price end) item1,
max(case when item = 2 then price end) item2,
max(case when item = 3 then price end) item3,
max(case when item = 4 then price end) item4
from tableA
group by id;
Xem Demo . Nhưng một phần của vấn đề mà bạn sẽ gặp phải là do bạn đang cố gắng chuyển đổi nhiều cột dữ liệu. Đề xuất của tôi để có được kết quả cuối cùng là bỏ chia dữ liệu trước. MySQL không có chức năng hủy chia nhưng bạn có thể sử dụng UNION ALL để chuyển đổi nhiều cặp cột thành hàng. Mã để bỏ chia sẻ sẽ tương tự như sau:
select id, concat('order', `order`) col, data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA;
Xem Demo . Kết quả của việc này sẽ là:
| ID | COL | VALUE |
-----------------------
| 1 | order1 | P |
| 1 | order1 | P |
| 1 | order1 | P |
| 1 | item1 | 50 |
| 1 | item2 | 60 |
| 1 | item3 | 70 |
Như bạn có thể thấy, điều này đã chiếm nhiều cột của order
/ data
và item
/ price
và chuyển nó thành nhiều hàng. Sau khi hoàn thành, bạn có thể chuyển đổi các giá trị trở lại thành cột bằng cách sử dụng hàm tổng hợp với CASE:
select id,
max(case when col = 'order1' then value end) order1,
max(case when col = 'order2' then value end) order2,
max(case when col = 'order3' then value end) order3,
max(case when col = 'item1' then value end) item1,
max(case when col = 'item2' then value end) item2,
max(case when col = 'item3' then value end) item3
from
(
select id, concat('order', `order`) col, data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA
) d
group by id;
Xem Demo . Cuối cùng, bạn cần chuyển đoạn mã trên thành một truy vấn câu lệnh chuẩn bị động:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when col = ''',
col,
''' then value end) as `',
col, '`')
) INTO @sql
FROM
(
select concat('order', `order`) col
from tableA
union all
select concat('item', `item`) col
from tableA
)d;
SET @sql = CONCAT('SELECT id, ', @sql, '
from
(
select id, concat(''order'', `order`) col, data value
from tableA
union all
select id, concat(''item'', item) col, price value
from tableA
) d
group by id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Xem SQL Fiddle với bản trình diễn . Điều này cho kết quả:
| ID | ORDER1 | ORDER2 | ORDER3 | ITEM1 | ITEM2 | ITEM3 | ITEM4 |
-------------------------------------------------------------------
| 1 | P | Q | (null) | 50 | 60 | 70 | (null) |
| 2 | P | (null) | S | 50 | 60 | (null) | 80 |