2012-05-25 13 views
8

शामिल करें, मैं अपने डेटासेट में एकाधिक कॉलम को अनपिवोट करने के लिए परीक्षण कर रहा हूं। यहां मेरा डेटा कैसा दिखता है।ओरेकल 11 जी: एकाधिक कॉलम को अनपिवोट करें और कॉलम नाम

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 

मैं बहुत तरह unpivoting हूँ ...

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 

लेकिन क्या मैं वास्तव में जरूरत है इस प्रकार है

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 

मैं यह कैसे कर सकते है ...?

+2

कुछ संभावित answerers की सहायता के लिए उपयोगी - http://sqlfiddle.com/#!4/12446/1 –

+0

यह बहुत अच्छा है! –

उत्तर

2

बस select idnum, sk, f, e, h, 'F'||SK as col_name ... आपको एक क्षुद्रग्रह के बजाय सभी कॉलम निर्दिष्ट करने की आवश्यकता है।

इस http://sqlfiddle.com/#!4/12446/21

8
तरह

अपने UNPIVOT बदलें इस

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; 

की तरह बनना इस चाल

+0

मैंने अपनी क्वेरी को एक समान तरीके से बनाने की कोशिश की, लेकिन मुझे त्रुटि मिलती है, "पिवट के लिए गैर-निरंतर अभिव्यक्ति की अनुमति नहीं है | अनपिवॉट मान" –

+0

@TomJMuthirenthi बस इसे उदाहरण के लिए (F1, E1, H1) 1 के रूप में बनाएं, I मुझे यकीन नहीं है कि आपके पास भाग के रूप में पत्र हो सकते हैं इसलिए बस एक संख्या का उपयोग करें – DasDave

0

क्या करना चाहिए यह प्रयास करें ..

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; 
संबंधित मुद्दे