PL/SQL:求两个值相减的平均值
Posted
技术标签:
【中文标题】PL/SQL:求两个值相减的平均值【英文标题】:PL/SQL: Finding the average of a substraction of two values 【发布时间】:2019-10-14 19:16:14 【问题描述】:本质上,我的部分功能是找到名为 Days_Stayed 的局部变量的平均值,它是 Departure_Date 和 Arrival_Date 的减法。 REGISTRATION 表只存储人到达和离开的日期,而不是停留时间本身。
我的问题是当客户停留超过一次时会发生这种情况,因此有多个 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
如果有人能帮我解决这个问题,将不胜感激!
【问题讨论】:
【参考方案1】:听起来应该是:
v_Output := (SELECT TO_CHAR(AVG(Departure_Date - Arrival_Date), 'Day')
FROM REGISTRATION WHERE Customer_Code = p_CustomerCode)
只需将减法放在 select 语句中。 这行得通吗?
【讨论】:
我会去看看,但是如果有多个出发和到达记录,会不会吓坏了? (假设客户多次入住) 没有平均函数会对列求和,然后除以行数。这是一个例子:java2s.com/Tutorials/Database/Oracle_Aggregate_Function/…【参考方案2】:对我来说,这听起来像 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>
为什么?您的代码减去出发和到达日期(单个值),那么 - 您将如何选择一个值的平均值?也许您打算使用循环(通过每个人)或其他方式,但是 - 上述查询可能会将您推向正确的方向,即没有循环,使用单个查询。
【讨论】:
以上是关于PL/SQL:求两个值相减的平均值的主要内容,如果未能解决你的问题,请参考以下文章