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;
/
请注意,我并没有实际运行/编译它,所以它可能有奇怪的语法问题,但原则是正确的