簡體   English   中英

ORACLE PL / SQL PIVOT過程

[英]ORACLE PL/SQL PIVOT procedure

我試圖編寫一個Oracle PL / SQL過程來計算一個簡單的混淆矩陣表。 我已經准備好標簽數據,基本上是兩列0和1,實際值與預測值。

我能夠用簡單的樞軸來計算它(我認為是最簡單的選擇):

SELECT * FROM 
( SELECT ACTUAL_VALUE, PREDICTED_VALUE
FROM MY_TABLE
)
PIVOT (
COUNT(PREDICTED_VALUE)
FOR PREDICTED_VALUE IN (1, 0))
ORDER BY ACTUAL_VALUE;

現在,我試圖將所有這些“插入” DECLARE,BEGIN ...框架,但沒有成功。 甚至可以創建程序來計算此樞軸嗎?

預先感謝您的任何建議!

我不得不使用游標和循環。 並使我的計算以此方式進行。 因此,關閉這一步驟。最后再加上3個匯總計算。 謝謝

CREATE OR REPLACE PROCEDURE "mydb"."C_MATRIX" 
IS
    CURSOR MY_DATA IS
        SELECT ACTUAL_CARD, PREDICTED_VALUE FROM my_table; 
    my_data_rec my_data%rowtype; 

    fp pls_integer := 0;
    tp pls_integer := 0;
    fn pls_integer := 0;
    tn pls_integer := 0;

BEGIN 
    OPEN my_data; 
    LOOP 
        FETCH my_data INTO my_data_rec; 
        EXIT WHEN my_data%notfound; 
            IF my_data_rec.ACTUAL_CARD = 0 and my_data_rec.PREDICTED_VALUE = 0 then
                tn := tn + 1;
            elsif my_data_rec.ACTUAL_CARD = 0 and my_data_rec.PREDICTED_VALUE = 1 then
                fn := fn + 1;
            elsif my_data_rec.ACTUAL_CARD = 1 and my_data_rec.PREDICTED_VALUE = 1 then
                tp := tp + 1;      
            elsif my_data_rec.ACTUAL_CARD = 1 and my_data_rec.PREDICTED_VALUE = 0 then
                fp := fp + 1;        
            end if;
    END LOOP; 

    dbms_output.put_line
    ('Number of false Positives: ' ||fp || '  Number of true Positives: ' ||tp  || '       Total numbers of records: ' ||(fp + tp) );
    dbms_output.put_line
    ('Number of false Negatives: ' ||fn || '   Number of true Negatives: ' ||tn  || '       Total numbers of records: ' ||(fn + tn ));
    dbms_output.put_line(' ');
    dbms_output.put_line
    (' Incorrect predictions: ' || (fp + fn) || '  Correct predictions: ' || (tp + tn) );
    dbms_output.put_line(' ');
    dbms_output.put_line(' Acurracy: ' || round((((tn + tp) / (tn + tp + fn + fp)) * 100),2) || '%');
    dbms_output.put_line(' Precision: ' || round(((tp / (tp + fp)) * 100),2) || '%');
    dbms_output.put_line(' Recall: ' || round(((tp / (tp + fn)) * 100),2) || '%');
END; 
/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM