在过程调用的函数中使用两个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;
在此先感谢。
刚刚从你的函数删除线'WHERE HT_ID = i_HT_ID'。 – 2013-04-25 17:28:06
可以这样做,但结果“9”将被放置在所有球队中。它重复它。 – Ryoss 2013-04-25 17:38:14
**更新**我用**选择和(当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