Những gì bạn cần làm trước tiên là giải nén dữ liệu và sau đó xoay nó. Nhưng tiếc là MySQL không có các chức năng này nên bạn sẽ cần phải sao chép chúng bằng cách sử dụng UNION ALL
truy vấn cho hàm bỏ chia sẻ và một hàm tổng hợp với CASE
cho trục.
Bỏ chia hoặc UNION ALL
mảnh lấy dữ liệu từ col1, col2, v.v. của bạn và biến nó thành nhiều hàng:
select id, month, col1 value, 'col1' descrip
from yourtable
union all
select id, month, col2 value, 'col2' descrip
from yourtable
union all
select id, month, col3 value, 'col3' descrip
from yourtable
union all
select id, month, col4 value, 'col4' descrip
from yourtable
Xem SQL Fiddle with Demo .
Kết quả:
| ID | MONTH | VALUE | DESCRIP |
----------------------------------
| 101 | Jan | A | col1 |
| 102 | feb | C | col1 |
| 101 | Jan | B | col2 |
| 102 | feb | A | col2 |
| 101 | Jan | (null) | col3 |
| 102 | feb | G | col3 |
| 101 | Jan | B | col4 |
| 102 | feb | E | col4 |
Sau đó, bạn đặt nó trong một truy vấn con để áp dụng tổng hợp và CASE
để chuyển đổi nó thành định dạng bạn muốn:
select descrip,
max(case when month = 'jan' then value else 0 end) jan,
max(case when month = 'feb' then value else 0 end) feb
from
(
select id, month, col1 value, 'col1' descrip
from yourtable
union all
select id, month, col2 value, 'col2' descrip
from yourtable
union all
select id, month, col3 value, 'col3' descrip
from yourtable
union all
select id, month, col4 value, 'col4' descrip
from yourtable
) src
group by descrip
Xem SQL Fiddle với bản trình diễn
Kết quả là:
| DESCRIP | JAN | FEB |
-----------------------
| col1 | A | C |
| col2 | B | A |
| col3 | 0 | G |
| col4 | B | E |