本质上,我的函数的一部分是找出一个名为Days_Stayed的局部变量的平均值,它是Departure_Date和Arrival_Date的减法。注册表只存储人员到达和离开的日期,而不是停留时间本身。
我的问题是,当客户端停留多次时,就会发生这种情况,因此会有多个Departure_Dates和Arrival_Dates。平均值由每个减法的结果之和组成,如果这是有意义的话。
CREATE OR REPLACE FUNCTION
(p_CustomerCode CHAR)
RETURN VARCHAR2
IS
v_Output VARCHAR2(100);
Days_Stayed DATE;
BEGIN
--SELECT STATEMENT FROM REGISTRATION TABLE--
IF Registration_Status = 'R' THEN
Days_Stayed = Departure_Date - Arrival_Date;
v_Output := (SELECT TO_CHAR(AVG(Days_Stayed), 'Day')
FROM REGISTRATION WHERE Customer_Code = p_CustomerCode),
--other columns
如果有人能帮我解决这个问题,我将不胜感激!
发布于 2019-10-14 19:23:04
听起来应该是:
v_Output := (SELECT TO_CHAR(AVG(Departure_Date - Arrival_Date), 'Day')
FROM REGISTRATION WHERE Customer_Code = p_CustomerCode)
只要将减法放在select语句中即可。这行得通吗?
发布于 2019-10-14 19:28:16
对我来说,它听起来像SUM
/ COUNT
。
SQL> with registration (id, departure_date, arrival_date) as
2 (select 1, date '2019-09-20', date '2019-09-17' from dual union all -- 3 days
3 select 1, date '2019-08-13', date '2019-08-11' from dual union all -- 2 days
4 select 1, date '2019-08-08', date '2019-08-01' from dual union all -- 7 days
5 --
6 select 2, date '2019-07-20', date '2019-07-19' from dual union all -- 1 day
7 --
8 select 3, date '2019-08-27', date '2019-08-25' from dual union all -- 2 days
9 select 3, date '2019-08-14', date '2019-08-12' from dual -- 2 days
10 )
11 select id,
12 sum(departure_date - arrival_date) / count(*) avg_days_stayed
13 from registration
14 group by id;
ID AVG_DAYS_STAYED
---------- ---------------
1 4
2 1
3 2
SQL>
为什么?您的代码减去出发日期和到达日期(单一值),那么如何选择一个平均值?也许你打算使用循环(通过每个人)或其他东西,但是-上面的查询可能会将你推向正确的方向,即没有循环,使用单个查询。
https://stackoverflow.com/questions/58382843
复制