Oracle SQL过程值集的最大值、最小值、平均值
我创建了以下过程:Oracle SQL过程值集的最大值、最小值、平均值,sql,oracle,stored-procedures,max,min,Sql,Oracle,Stored Procedures,Max,Min,我创建了以下过程: SET SERVEROUTPUT ON; CREATE OR REPLACE PROCEDURE sales_period ( purchdate1 IN DATE, purchdate2 IN DATE ) IS CURSOR purchcur IS SELECT purchases.purchdate, max(purchases.purchprice) max1, min(purchases.purchprice)
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE sales_period (
purchdate1 IN DATE,
purchdate2 IN DATE
)
IS
CURSOR purchcur IS
SELECT purchases.purchdate, max(purchases.purchprice) max1,
min(purchases.purchprice) min1, avg(purchases.purchprice) avg1
FROM purchases
WHERE purchases.purchdate BETWEEN sales_period.purchdate1 AND
sales_period.purchdate2
group by purchases.purchdate;
purchrow purchcur%ROWTYPE;
e_foreign_key_error EXCEPTION;
PRAGMA EXCEPTION_INIT (e_foreign_key_error, -2291);
BEGIN
OPEN purchcur;
LOOP
FETCH purchcur INTO purchrow;
DBMS_OUTPUT.PUT_LINE('Sales report: ');
DBMS_OUTPUT.PUT_LINE('Date sold: ' || purchrow.purchdate);
DBMS_OUTPUT.PUT_LINE('Max saleprice: ' || purchrow.max1);
DBMS_OUTPUT.PUT_LINE('Avg saleprice: ' || purchrow.avg1);
DBMS_OUTPUT.PUT_LINE('Min saleprice: ' || purchrow.min1);
EXIT WHEN purchcur%NOTFOUND;
END LOOP;
EXCEPTION
WHEN e_foreign_key_error THEN
DBMS_OUTPUT.PUT_LINE('no existing field in parent table');
CLOSE purchcur;
END;
/
我要做的是输入两个日期,然后打印出销售报告,即该期间(输入的两个日期之间)的最高、平均和最低价格。所以,问题是我所做的是:
SQL> exec sales_period('1-Jun-15', '30-Aug-15');
Sales report:
Date sold: 03-JUL-15
Max saleprice: 1600
Avg saleprice: 1600
Min saleprice: 1600
Sales report:
Date sold: 05-JUL-15
Max saleprice: 5000
Avg saleprice: 5000
Min saleprice: 5000
Sales report:
Date sold: 10-AUG-15
Max saleprice: 3000
Avg saleprice: 3000
Min saleprice: 3000
Sales report:
Date sold: 02-JUN-15
Max saleprice: 2000
Avg saleprice: 2000
Min saleprice: 2000
Sales report:
Date sold: 07-JUL-15
Max saleprice: 1500
Avg saleprice: 1500
Min saleprice: 1500
我想要它做的是得到这些日期之间的所有价格,并计算出最大值,最小值和平均值,只显示一次。比如说
2015年7月1日其售价为1000
2015年7月2日的售价为1300英镑
2015年7月28日的售价为1500英镑
我做exec sales_期间(“2015年7月1日”、“2015年7月30日”)代码>
我希望它像这样打印出来:
Max:1500,min:1000,avg:1300
它不像我运行它时所做的那样-它在每个日期都运行,并且没有得到总体的最小值、最大值和平均值。我希望它能得到总的最小值,最大值和平均值
我想得到一些帮助谢谢 您不想按购买日期分组,因为您的范围内有多个日期,因此会有多个结果
我也有点不确定您定义的异常
在我看来,以下内容更符合你的要求
CREATE OR REPLACE PROCEDURE sales_period (
purchdate1 IN DATE,
purchdate2 IN DATE
)
IS
l_max_price NUMBER;
l_min_price NUMBER;
l_avg_price NUMBER
BEGIN
SELECT max(purchases.purchprice) max1,
min(purchases.purchprice) min1,
avg(purchases.purchprice) avg1
INTO l_max_price,
l_min_price,
l_avg_price
FROM purchases
WHERE purchases.purchdate BETWEEN purchdate1 AND purchdate2;
DBMS_OUTPUT.PUT_LINE('Sales report: ');
DBMS_OUTPUT.PUT_LINE('Date range sold: ' || TO_CHAR(purchdate1,'DD-MON-YYYY')|| ' TO ' || TO_CHAR(purchdate2,'DD-MON-YYYY'));
DBMS_OUTPUT.PUT_LINE('Max saleprice: ' || l_max_price);
DBMS_OUTPUT.PUT_LINE('Avg saleprice: ' || l_avg_price);
DBMS_OUTPUT.PUT_LINE('Min saleprice: ' || l_min_price);
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE('no data for the date range');
END;
/
请注意,我并没有实际运行/编译它,所以它可能有奇怪的语法问题,但原则是正确的