2013-05-03 20 views
9

Tôi muốn biết làm thế nào để UNPIVOT Table_1 vào Expected_Result_Table:transposing Cột động đến dòng

Table1 
----------------------------------------- 
Id  abc brt ccc ddq eee fff gga hxx 
----------------------------------------- 
12345  0 1 0 5 0 2 0 0 
21321  0 0 0 0 0 0 0 0 
33333  2 0 0 0 0 0 0 0 
41414  0 0 0 0 5 0 0 1 
55001  0 0 0 0 0 0 0 2 
60000  0 0 0 0 0 0 0 0 
77777  9 0 3 0 0 0 0 0 
Expected_Result_Table 
--------------------- 
Id  Word Qty>0 
--------------------- 
12345 brt 1 
12345 ddq 5 
12345 fff 2 
33333 abc 2 
41414 eee 5 
41414 hxx 1 
55001 hxx 2 
77777 abc 9 
77777 ccc 3 

Vì vậy, Làm thế nào để transpose cột trong Table_1 dẫn đến Expected_Result_Table, xem xét chỉ có giá trị> 0 ?

Trả lời

19

MySQL không có chức năng UNPIVOT, nhưng bạn có thể chuyển đổi các cột thành hàng bằng cách sử dụng UNION ALL.

Cú pháp cơ bản là:

select id, word, qty 
from 
(
    select id, 'abc' word, abc qty 
    from yt 
    where abc > 0 
    union all 
    select id, 'brt', brt 
    from yt 
    where brt > 0 
) d 
order by id; 

Trong trường hợp của bạn, bạn nói rằng bạn cần một giải pháp cho các cột năng động. Nếu đúng như vậy, sau đó bạn sẽ cần phải sử dụng một tuyên bố chuẩn bị để tạo SQL động:

SET @sql = NULL; 

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'select id, ''', 
     c.column_name, 
     ''' as word, ', 
     c.column_name, 
     ' as qty 
     from yt 
     where ', 
     c.column_name, 
     ' > 0' 
    ) SEPARATOR ' UNION ALL ' 
) INTO @sql 
FROM information_schema.columns c 
where c.table_name = 'yt' 
    and c.column_name not in ('id') 
order by c.ordinal_position; 

SET @sql 
    = CONCAT('select id, word, qty 
      from 
      (', @sql, ') x order by id'); 


PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

Xem SQL Fiddle with Demo

+0

Xin chào, bluefeet! Bạn đã giải quyết được vấn đề. Cảm ơn rất nhiều! –

+0

Đây là tuyệt vời .. không có phép thuật :) – UberNeo

6

Về cơ bản bạn đang chia nhỏ dữ liệu từ các cột thành các hàng, mà bạn có thể sử dụng UNION ALL. Các bộ lọc có thể được áp dụng trên truy vấn phụ không được phân loại hoặc riêng lẻ cho các phần.

select id, Word, Qty from 
(
    select id, 'abc' Word, abc Qty from table1 
    union all 
    select id, 'brt', brt from table1 
    union all 
    select id, 'ccc', ccc from table1 
    union all 
    select id, 'ddq', ddq from table1 
    union all 
    select id, 'eee', eee from table1 
    union all 
    select id, 'fff', fff from table1 
    union all 
    select id, 'gga', gga from table1 
    union all 
    select id, 'hxx', hxx from table1 
) x 
where Qty > 0 
order by id; 
+0

[SQL Fiddle Demo] (http://sqlfiddle.com/#!2/ b0934/6/0) – RichardTheKiwi

+0

Cảm ơn, Richard. Bảng của tôi có các cột động và không xác định. –

Các vấn đề liên quan