Nếu bạn đã có một số được biết đến các giá trị cho cả order
và item
, sau đó bạn khó có thể mã truy vấn vào:
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ắp có là vì bạn đang cố 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 sẽ là hủy bỏ dữ liệu đầu tiên. MySQL không có chức năng bỏ ghim nhưng bạn có thể sử dụng UNION ALL để chuyển đổi nhiều cặp cột thành các hàng. Mã để bỏ khóa 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 đã đưa ra những nhiều cột của order
/data
và item
/price
và chuyển đổi nó thành nhiều hàng. Khi đã hoàn tất, sau đó bạn có thể chuyển đổi các giá trị trở lại vào cột sử dụng một chức năng tổng hợp với một 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 phải chuyển đổi mã ở trên thành truy vấn báo cáo được 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 with demo. Đ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 |