2012-06-21 233 views
0

這已被問過好幾次,並且已被多次回答,但這是不同的,因爲 1)這是在Oracle 11g中 - 我見過的其他示例在SQL Server中具有StUFF功能 2 )這需要加入2個表來獲取信息將行轉換爲列Oracle

讓我解釋一下

這是存放字段名& FILE_ID

CREATE TABLE RESPONSE_METADATA 
(
    FILE_ID  NUMBER(10)      NOT NULL, 
    FIELD_NUMBER NUMBER(4)      NOT NULL, 
    FIELD_NAME  VARCHAR2(50 BYTE)    NOT NULL, 
    FIELD_TYPE  VARCHAR2(50 BYTE)    NOT NULL 
); 

這是保存每個文件記錄的表,但記錄是分開的。

CREATE TABLE RESPONSE_DETAILS 
(
    FILE_ID  NUMBER(10), 
    REC_FLD_1  VARCHAR2(300 BYTE), 
    REC_FLD_2  VARCHAR2(300 BYTE), 
    REC_FLD_3  VARCHAR2(300 BYTE), 
    REC_FLD_4  VARCHAR2(300 BYTE), 
    REC_FLD_5  VARCHAR2(300 BYTE), 
    REC_FLD_6  VARCHAR2(300 BYTE), 
    REC_FLD_7  VARCHAR2(300 BYTE), 
    REC_FLD_8  VARCHAR2(300 BYTE), 
    REC_FLD_9  VARCHAR2(300 BYTE), 
    REC_FLD_10  VARCHAR2(300 BYTE), 
    REC_FLD_11  VARCHAR2(300 BYTE), 
    REC_FLD_12  VARCHAR2(300 BYTE), 
    REC_FLD_13  VARCHAR2(300 BYTE), 
    REC_FLD_14  VARCHAR2(300 BYTE), 
    REC_FLD_15  VARCHAR2(300 BYTE), 
    REC_FLD_16  VARCHAR2(300 BYTE), 
    REC_FLD_17  VARCHAR2(300 BYTE), 
    REC_FLD_18  VARCHAR2(300 BYTE), 
    REC_FLD_19  VARCHAR2(300 BYTE), 
    REC_FLD_20  VARCHAR2(300 BYTE) 
); 

插入數據

INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,1,'REC_ID','NUMBER'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,2,'EMAIL','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,3,'CAMP','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,4,'ACTION','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,5,'DESC','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,6,'TIME','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,7,'CHANNEL','NUMBER'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,8,'STATUS','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,9,'DI_CODE','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (1,10,'CUSTOM','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (2,1,'REC_ID','NUMBER'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (2,2,'EMAIL','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (2,3,'CAMP','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (2,4,'ACTION','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (2,5,'DESC','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (3,1,'REC_ID','NUMBER'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (3,2,'EMAIL','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (3,3,'CAMP','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,1,'REC_ID','NUMBER'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,2,'ORGN','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,3,'LOGOS','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,4,'ACTN','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,5,'BLANK1','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,6,'ALERT_ID','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,7,'DEVNUM','NUMBER'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,8,'RES_CODE','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,9,'STRAT_ID','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,10,'COMP_FLAG','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,11,'AUDLOG','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,12,'STARTTIME','VARCHAR2'); 
INSERT INTO RESPONSE_METADATA (FILE_ID, FIELD_NUMBER, FIELD_NAME, FIELD_TYPE) VALUES (4,13,'DURATION','VARCHAR2'); 

INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (8,'67537','Line','','81433','1','15062012','DELIVERED','67537','','','','','','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (8,'67551','Line','','81430','1','15062012','DELIVERED','67551','','','','','','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (8,'67579','Line','','81403','1','15062012','DELIVERED','67579','','','','','','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (8,'67593','Line','','81452','1','15062012','DELIVERED','67593','','','','','','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (8,'67607','Line','','81453','1','15062012','DELIVERED','67607','','','','','','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (4,'28072','16','1','189325','','ins/code.com/20120621','6551','WID ','VOLN ','N',';B10100','41061.6740856481','14','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (4,'28072','16','1','189325002','','ins/code.com/20120622','6551','CON ','VOLN ','N',';B10100','41061.6978240741','124','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (4,'28075','15','30','443433001','','ins/code.com/20120623','5908','AMP ','VOLN ','N',';B10100','41061.6737268519','13','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (4,'28075','15','30','4443433','','ins/code.com/20120624','5908','CON ','VOLN ','N',';B10100','41061.6953240741','113','','','','','','',''); 
INSERT INTO RESPONSE_DETAILS (FILE_ID, REC_FLD_1, REC_FLD_2, REC_FLD_3, REC_FLD_4, REC_FLD_5, REC_FLD_6, REC_FLD_7, REC_FLD_8, REC_FLD_9, REC_FLD_10, REC_FLD_11, REC_FLD_12, REC_FLD_13, REC_FLD_14, REC_FLD_15, REC_FLD_16, REC_FLD_17, REC_FLD_18, REC_FLD_19, REC_FLD_20)VALUES (4,'28078','11','1','2576141','','ins/code.com/20120625','6681','CON ','VOLN ','N',';B10100','41061.6764236111','81','','','','','','',''); 

現在的問題是

我希望數據可以看出這樣

FILE_ID REC_ID EMAIL CAMP ACTION DESC TIME CHANNEL STATUS DI_CODE CUSTOM 
1 67537 Line  81433 1 15062012 DELIVERED 67537  
1 67551 Line  81430 1 15062012 DELIVERED 67551  
1 67579 Line  81403 1 15062012 DELIVERED 67579  
1 67593 Line  81452 1 15062012 DELIVERED 67593  
1 67607 Line  81453 1 15062012 DELIVERED 67607  


FILE_ID REC_ID ORGN LOGOS ACTN BLANK1 ALERT_ID   DEVNUM RES_CODE STRAT_ID COMP_FLAG AUDLOG STARTTIME DURATION 
4 28072 16 1 189325   ins/code.com/20120621 6551 WID   VOLN N  ;B10100 1/06/2012 16:10 14 
4 28072 16 1 1893250   ins/code.com/20120622 6551 CON   VOLN N  ;B10100 1/06/2012 16:44 124 
4 28075 15 30 4434330   ins/code.com/20120623 5908 AMP   VOLN N  ;B10100 1/06/2012 16:10 13 
4 28075 15 30 4443433   ins/code.com/20120624 5908 CON   VOLN N  ;B10100 1/06/2012 16:41 113 
4 28078 11 1 2576141   ins/code.com/20120625 6681 CON   VOLN N  ;B10100 1/06/2012 16:14 81 

它需要的工作方式是每file_id的元數據表具有FIELD_NUMBER。這些Filed_Numbers是詳細信息表中的列

我已經嘗試過Oracle中的XML PIVOT,它不工作,因爲這些列將創建多個節點。

我試過只是旋轉的東西 - 沒有工作。這需要動態--File_ID可以有任何數量的字段不超過30。

而這需要一個存儲過程或查詢 - 因爲我沒有建立ETL的權限。

非常感謝您的幫助。

乾杯

+0

如何是你的相關期望的結果,兩塊?你的測試數據有'file_id''4'和'8',你的輸出有'1'和'4'? –

+0

所以如果我理解你的需求,那麼你想做一些列名「本地化」('REC_FLD_1'->'REC_ID')?每個'FILE_ID'都必須使用一個動態查詢,但爲什麼不在客戶端執行?還是我錯了? –

回答

0

試試這個生成腳本:

select 'select '||FILE_ID||' FILE_ID,'|| 
    ltrim(sys_connect_by_path('REC_FLD_'||FIELD_NUMBER||' "'||FIELD_NAME||'"',','),',')|| 
    ' from RESPONSE_DETAILS where FILE_ID=' ||FILE_ID||';' 
    from (select t.*,count(*) over (partition by FILE_ID) cnt from RESPONSE_METADATA t) 
where cnt=FIELD_NUMBER start with FIELD_NUMBER=1 
connect by prior FILE_ID=FILE_ID and prior FIELD_NUMBER=FIELD_NUMBER-1 

加雙引號,因爲一些列名是保留「DESC」例如

+0

@PeterLang REC_FLD_1與REC_ID – CeeVei

+0

Nahuel Fouilleul沒有任何關係感謝腳本 - 這真是太棒了 - 但是我忘了提及 - 我剛剛開始使用Oracle。我嘗試創建PL/SQL並運行正在返回的select語句,但它並未向我提供Select語句的表/結果集。我正在使用蟾蜍。你能協助嗎?我非常感謝你 - 我已經接近了 - 感謝你。 – CeeVei

+0

感謝您爲了簡單起見而添加雙重qoutes - 我將列名縮短 - 它實際上在我的表 – CeeVei