2013-04-25 32 views
0

在过程调用的函数中使用两个sum()时,我遇到了一个问题。输入的结果是分开的。下面的表格,功能和程序是我尝试过的。附: - 当有单个总和(x)时它工作正常。在函数/过程中实现选择和查询不起作用

DROP TABLE MATCH; 
    CREATE TABLE MATCH 
     (M_ID VARCHAR2 (4) NOT NULL, 
     HT_ID VARCHAR2 (4), 
     AT_ID VARCHAR2 (4), 
     P_F NUMBER (3), 
     P_A NUMBER (3)); 


INSERT INTO MATCH VALUES 
('M01','T1', 'T2', 2, 0); 

INSERT INTO MATCH VALUES 
('M02','T1', 'T2', 1, 1); 

INSERT INTO MATCH VALUES 
('M03','T1', 'T2', 0, 2); 

INSERT INTO MATCH VALUES 
('M04','T1', 'T2', 0, 2); 

INSERT INTO MATCH VALUES 
('M05','T2', 'T1', 2, 0); 

INSERT INTO MATCH VALUES 
('M06','T2', 'T1', 0, 2); 

INSERT INTO MATCH VALUES 
('M07','T2', 'T1', 1, 2); 

INSERT INTO MATCH VALUES 
('M08','T2', 'T1', 0, 2); 

临时表(其中的结果将被存储):

DROP TABLE RESULTS; 
CREATE GLOBAL TEMPORARY TABLE RESULTS 
(ht_id varchar2 (5), 
FINAL NUMBER (2)) 
ON COMMIT PRESERVE ROWS; 

insert into RESULTS values('T1', NULL); 
insert into RESULTS values('T2', NULL); 
insert into RESULTS values('T3', NULL); 
insert into RESULTS values('T4', NULL); 
insert into RESULTS values('T5', NULL); 

查询我申请:

select 
sum(case when HT_ID='T1' then P_F else 0 end) + 
sum(case when AT_ID='T1' then P_A else 0 end) 
from match; 

返回9的结果,我所施加的选择查询在一个函数中,并创建了一个过程来调用该函数并将结果存储在临时表中。尽管在函数中完成的总和的结果是分开的(例如,对于T1而言为6,对于T2来说为3,尽管对于T1来说应该只有9个点)。

HT_ID  FINAL 
----- ---------- 
T1    3 
T2    6 
T3    0 
T4    0 
T5    0 

如何保留与查询相同的结果并将它们输入到临时表中? 象下面这样:

HT_ID  FINAL 
----- ---------- 
T1    9 
T2    0 
T3    0 
T4    0 
T5    0 

这是我在功能和程序方面的尝试:

drop function RESULTSFINAL; 
CREATE OR REPLACE FUNCTION RESULTSFINAL(i_HT_ID RESULTS.HT_ID%TYPE) 

RETURN VARCHAR2 
IS 

v_RESULTS_FINAL RESULTS.FINAL%TYPE; 


BEGIN 
select sum(case when HT_ID='T1' then P_F else 0 end)+ sum(case when AT_ID='T1' then P_A else 0 end) 
INTO v_RESULTS_FINAL 
FROM MATCH 
WHERE HT_ID = i_HT_ID; 

IF v_RESULTS_FINAL IS NULL THEN 
    v_RESULTS_FINAL := 0; 
END IF; 
RETURN v_RESULTS_FINAL; 
END; 
/

过程:

CREATE OR REPLACE PROCEDURE FINALSCORES 
    AS 

    CURSOR c_RESULTS 
    IS 

    SELECT HT_ID 
    FROM RESULTS; 


    v_HT_ID RESULTS.HT_ID%TYPE; 
    v_RESULTS_FINAL RESULTS.FINAL%TYPE; 

    BEGIN 

    OPEN c_RESULTS; 

    LOOP 

    FETCH c_RESULTS INTO v_HT_ID; 

    EXIT WHEN c_RESULTS%NOTFOUND; 

    v_RESULTS_FINAL := RESULTSFINAL(v_HT_ID); 

    UPDATE RESULTS 
    SET FINAL = v_RESULTS_FINAL 
    WHERE HT_ID = v_HT_ID; 


    END LOOP; 
    CLOSE c_RESULTS; 

    END; 
    /

执行FINALSCORES;

在此先感谢。

+0

刚刚从你的函数删除线'WHERE HT_ID = i_HT_ID'。 – 2013-04-25 17:28:06

+0

可以这样做,但结果“9”将被放置在所有球队中。它重复它。 – Ryoss 2013-04-25 17:38:14

+0

**更新**我用**选择和(当HT_ID ='T1'或HT_ID ='T2'或HT_ID ='T3'或HT_ID ='T4'或HT_ID ='时的情况改变了函数中的select语句T5'then P_F else 0 end)+ sum(AT_ID ='T1'或AT_ID ='T2'或AT_ID ='T3'或AT_ID ='T4'或AT_ID ='T5'时的情况,则P_A else 0结束)** **现在**我按照自己想要的方式得到结果,但是按照错误的顺序,正确的点会转到错误的团队。请帮助! :) – Ryoss 2013-04-25 17:40:05

回答

1
select 
    sum(case when HT_ID=i_HT_ID then P_F else 0 end) 
    + sum(case when AT_ID=i_HT_ID then P_A else 0 end) 
INTO v_RESULTS_FINAL 
FROM MATCH; 
+0

非常感谢叶戈尔!这是完美的! – Ryoss 2013-04-25 17:54:53

1

您也可以按照如下进行使用DECODE相同:

CREATE OR REPLACE FUNCTION RESULTSFINAL(i_HT_ID RESULTS.HT_ID%TYPE) 
RETURN VARCHAR2 
IS 

    v_RESULTS_FINAL RESULTS.FINAL%TYPE; 
BEGIN 

     select sum(decode(HT_ID,i_HT_ID,P_F, 
           decode(AT_ID,i_HT_ID,P_A,0))) 
       into v_RESULTS_FINAL 
     from match; 

     IF v_RESULTS_FINAL IS NULL THEN 
      v_RESULTS_FINAL := 0; 
     END IF; 

     RETURN v_RESULTS_FINAL; 
END; 
/