2012-05-25 39 views
8

Tôi đang cố gắng hủy bỏ nhiều cột trong tập dữ liệu của mình. Đây là dữ liệu của tôi.Oracle 11g: Tháo nhiều cột và bao gồm tên cột

CREATE TABLE T5 (idnum NUMBER,f1 NUMBER(10,5),f2 NUMBER(10,5),f3 NUMBER(10,5),e1 NUMBER(10,5),e2 NUMBER(10,5),h1 NUMBER(10,5),h2 NUMBER(10,5)); 

INSERT INTO T5 (IDNUM,F1,F2,F3,E1,E2,H1,H2) VALUES (1,'10.2004','5.009','7.330','9.008','8.003','.99383','1.43243'); 
INSERT INTO T5 (IDNUM,F1,F2,F3,E1,E2,H1,H2) VALUES (2,'4.2004','6.009','9.330','4.7008','4.60333','1.993','3.3243'); 
INSERT INTO T5 (IDNUM,F1,F2,F3,E1,E2,H1,H2) VALUES (3,'10.2040','52.6009','67.330','9.5008','8.003','.99383','1.43243'); 
INSERT INTO T5 (IDNUM,F1,F2,F3,E1,E2,H1,H2) VALUES (4,'9.20704','45.009','17.330','29.008','5.003','3.9583','1.243'); 

COMMIT; 

select * from t5; 

IDNUM F1 F2  F3  E1  E2  H1  H2 

1 10.2004 5.009 7.33 9.008 8.003 0.99383 1.43243 
2 4.2004 6.009 9.33 4.7008 4.60333 1.993 3.3243 
3 10.204 52.6009 67.33 9.5008 8.003 0.99383 1.43243 
4 9.20704 45.009 17.33 29.008 5.003 3.9583 1.243 

Tôi unpivoting như vậy ...

select * 
from (select IDNUM,F1,F2,F3,E1,E2,H1,H2, 
     null as E3,null as H3 
     from T5) 
UnPivot((F,E,H) for sk in ((F1,E1,H1) as 1, 
           (F2,E2,H2) as 2, 
           (F3,E3,H3) as 3)) 
order by IDNUM,SK; 

IDNUM SK  F  E  H 
----- -- ------- ------- ------- 
    1 1 10.2004 9.008 .99383 
    1 2 5.009 8.003 1.43243 
    1 3  7.33  null  null 
    2 1 4.2004 4.7008 1.993 
    2 2 6.009 4.60333 3.3243 
    2 3  9.33  null  null 
    3 1 10.204 9.5008 .99383 
    3 2 52.6009 8.003 1.43243 
    3 3 67.33  null  null 
    4 1 9.20704 29.008 3.9583 
    4 2 45.009 5.003 1.243 
    4 3 17.33  null  null 

Nhưng những gì tôi thực sự cần là như sau ...

IDNUM SK  F  E  H F_COL_NAME 
----- -- ------- ------- ------- ---------- 
    1 1 10.2004 9.008 .99383   F1 
    1 2 5.009 8.003 1.43243   F2 
    1 3  7.33  null  null   F3 
    2 1 4.2004 4.7008 1.993   F1 
    2 2 6.009 4.60333 3.3243   F2 
    2 3  9.33  null  null   F3 
    3 1 10.204 9.5008 .99383   F1 
    3 2 52.6009 8.003 1.43243   F2 
    3 3 67.33  null  null   F3 
    4 1 9.20704 29.008 3.9583   F1 
    4 2 45.009 5.003 1.243   F2 
    4 3 17.33  null  null   F3 

Làm thế nào tôi có thể làm điều này?

+2

Something hữu ích để hỗ trợ người trả lời tiềm năng - http://sqlfiddle.com/#!4/12446/1 –

+0

Thật là tuyệt vời! –

Trả lời

8

Thay đổi UNPIVOT của bạn sẽ được như thế này

select A.*, sk 
from (select IDNUM,F1,F2,F3,E1,E2,H1,H2, 
     null as E3,null as H3 
     from T5) AS A 
UnPivot((F,E,H) for sk in ((F1,E1,H1) as F1, 
           (F2,E2,H2) as F2, 
           (F3,E3,H3) as F3)) 
order by IDNUM,SK; 

này nên làm các trick

+0

Tôi đã thử truy vấn của mình theo kiểu tương tự, nhưng tôi gặp lỗi "biểu thức không liên tục không được phép cho giá trị trục chính" –

+0

@TomJMuthirenthi chỉ tạo ví dụ (F1, E1, H1) thành 1, I 'không chắc chắn bạn có thể có chữ cái vv trong phần như vậy chỉ cần sử dụng một số – DasDave

0

Hãy thử này ..

select * from (select IDNUM,F1,F2,F3,E1,E2,H1,H2, null as E3,null as H3 from T5) UnPivot((F,E,H) for sk in ((F1,E1,H1) as 'F1', 
          (F2,E2,H2) as 'F2', 
          (F3,E3,H3) as 'F3')) order by IDNUM,SK; 
Các vấn đề liên quan