【问题标题】:Oracle SQL procedure MAX, MIN, AVG of set of values一组值的 Oracle SQL 过程 MAX、MIN、AVG
【发布时间】:2017-06-15 12:32:15
【问题描述】:

我已经创建了这个程序:

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

我想要它做的是获取这些日期之间的所有价格,并计算出最大值、最小值和平均值并只显示一次。就像,让我们说......

01-Jul-2015 售价 1000

02-Jul-2015 售价为 1300

28-Jul-2015 售价 1500

我愿意exec sales_period('1-Jul-15', '30-Jul-15');

我希望它像这样打印出来:

Max: 1500, min: 1000, avg: 1300

不像我运行它时所做的那样 - 它在每个日期都执行它,并且没有得到最小值、最大值和平均值总体。我希望它得到整体的最小值、最大值和平均值。

我希望得到一些帮助! - 谢谢!!

【问题讨论】:

    标签: sql oracle stored-procedures max min


    【解决方案1】:

    您不想按 purchase_date 分组,因为您的范围内有多个日期,因此您有多个结果。

    我也有点不确定你定义的异常。

    在我看来,以下内容更符合您的要求;

    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;
    /
    

    请注意,我实际上并没有运行/编译它,所以它可能有奇怪的语法问题,但原则是不变的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-05
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2015-12-03
      • 2022-11-14
      相关资源
      最近更新 更多