2012-12-19 28 views
9

Tôi có một bảng như thế nàyMysql Chuyển đổi cột chèo (bảng Pivot)

+---+-----+----+----+----+----+ 
|id |month|col1|col2|col3|col4| 
+---+-----+----+----+----+----+ 
|101|Jan |A |B |NULL|B | 
+---+-----+----+----+----+----+ 
|102|feb |C |A |G |E | 
+---+-----+----+----+----+----+ 

Và sau đó tôi muốn tạo báo cáo như thế này

+----+---+---+ 
|desc|jan|feb| 
+----+---+---+ 
|col1|A |C | 
+----+---+---+ 
|col2|B |A | 
+----+---+---+ 
|col3|0 |G | 
+----+---+---+ 
|Col4|B |E | 
+----+---+---+ 

bất cứ ai có thể giúp với điều này?

+0

Chào mừng bạn đến với stackoverflow. [Đây là một câu hỏi rất phổ biến] (http://stackoverflow.com/search?q= [mysql] + trục). Vui lòng dành một vài phút để tìm kiếm các lưu trữ. Trước tiên hãy thử điều chỉnh một trong các câu trả lời trước. Sau đó, nếu bạn gặp sự cố, hãy đăng truy vấn của bạn và bất kỳ lỗi nào tại đây. – Leigh

+0

có thể trùng lặp của [hàng pivot của MySQL thành số cột động] [http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – RichardTheKiwi

Trả lời

28

Điều bạn cần làm trước tiên, hủy hợp nhất dữ liệu và sau đó xoay vòng dữ liệu đó. Nhưng tiếc là MySQL không có các chức năng này, do đó bạn sẽ cần phải sao chép chúng bằng cách sử dụng truy vấn UNION ALL cho trục xoay và chức năng tổng hợp với một số CASE cho trục xoay.

Các UNPIVOT hoặc UNION ALL mảnh mất dữ liệu từ col1 của bạn, col2, vv 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 quấn này trong một subquery để áp dụng tổng hợp và CASE để chuyển đổi này sang đị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 with demo

Các kết quả là:

| DESCRIP | JAN | FEB | 
----------------------- 
| col1 | A | C | 
| col2 | B | A | 
| col3 | 0 | G | 
| col4 | B | E | 
+0

Cảm ơn bạn vì điều này! Siêu hữu ích. –

+1

Cảm ơn bạn rất nhiều. Điều gì sẽ xảy ra nếu 'yourtable' là một bảng dẫn xuất xuất phát từ truy vấn phụ. Tôi sẽ thay thế mọi 'yourtable' bằng cái gì đó như' FROM (SELECT * FROM table WHERE name = 'condition') t1'? –

+1

@Accountant م Vâng, đó chính xác là những gì bạn sẽ làm – Taryn