【问题标题】:sum of total values PL/SqlPL/Sql 总值之和
【发布时间】:2018-01-24 18:25:16
【问题描述】:

我正在尝试获取一个 PLSQL 语句来显示所有客户 ID 列表和每个客户的订单价值总和。下面的代码让我得到了正确的答案,但问题是我有多个具有相同 ID 的客户,我需要将他们的所有订单值加总在只有 1 个 ID 输出而不是多个下。我的代码让我为同一个客户提供多个输出。

  Create table sales (customer_ID number(10), product_ID number(10), quantity number(10));

INSERT INTO sales (customer_ID, product_ID, quantity) Values(3,1,23);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(1,2,34);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(1,3,654);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(3,7,32);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(4,3,23);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(3,3,111);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(5,4,6);




Create table products (product_ID number(10), price number(10));
INSERT INTO products (product_ID, price) Values(1,32);
INSERT INTO products (product_ID, price) Values(2,121);
INSERT INTO products (product_ID, price) Values(3,3000);
INSERT INTO products (product_ID, price) Values(4,621);
INSERT INTO products (product_ID, price) Values(5,363);
INSERT INTO products (product_ID, price) Values(6,32);
INSERT INTO products (product_ID, price) Values(7,3);
INSERT INTO products (product_ID, price) Values(8,432);
INSERT INTO products (product_ID, price) Values(9,11);
INSERT INTO products (product_ID, price) Values(10,73);


declare
cursor cur is select unique sales.quantity,products.price,sales.customer_ID
from sales,products
where sales.product_id=products.product_id
order by customer_ID desc;
prod number;
quan number(10);
pri number(10);
c_id number(10);
begin
open cur;
loop
fetch cur into quan,pri,c_id;
exit when cur%notfound;
prod:=pri*quan;
DBMS_OUTPUT.PUT_LINE('customer_id =' || c_id);
DBMS_OUTPUT.PUT_LINE('quantity value =' || quan);
DBMS_OUTPUT.PUT_LINE('price =' || pri);
DBMS_OUTPUT.PUT_LINE('The total value of customer purchases is = ' || prod);
end loop;
close cur;
END

请注意。

【问题讨论】:

  • 请提供create table 语句,并确保在insert 语句中添加INSERT into table_name 子句。而且,你真的需要使用PL/SQL吗?可以用普通的SQL 完成。 PL/SQL LOOP, row-by-row 又名 slow-by-slow.
  • 更改已完成,是的,我需要通过 pl/sql 获取它,代码已准备好我只需要 1 个输出下的相同客户 ID 的总和
  • 您期望的输出是什么,为什么您“必须”在 PL/SQL 中这样做?请使用预期输出更新您的问题。

标签: sql oracle plsql


【解决方案1】:

试试这个

SELECT CUSTOMER_ID
     ,SUM(QUANTITY) as Total_Quantity
     ,SUM(QUANTITY*PRICE) as Total_Price
FROM
SALES s INNER JOIN
PRODUCTS p on p.PRODUCT_ID=s.PRODUCT_ID
GROUP BY CUSTOMER_ID   // Group By each customer Id.

【讨论】:

  • 请就这个问题提出建议stackoverflow.com/questions/31385608/…
  • 对不起,我是新来的,我不知道你接受答案是什么意思。谢谢
  • 您需要点击与下面答案相关的Tick 标记,该标记将变为绿色,表示它对您有帮助。因此,下一次,如果有人面临同样的问题,那么他们只需寻找可接受的答案。请通过此链接了解stackoverflow.com/tour
  • 另外,您不能接受多个答案。 :) 你只需要选择一个答案。您选择的答案将变为绿色,其他将被视为不接受
  • 好的.. 你现在能帮我解决这个问题吗? stackoverflow.com/questions/31385608/…
【解决方案2】:

您只需使用 GROUP BYSUM 作为聚合函数。

使用 PL/SQL

SQL> SET serveroutput ON
SQL> DECLARE
  2    CURSOR cur
  3    IS
  4      SELECT SUM(sales.quantity),
  5        SUM(products.price),
  6        sales.customer_ID
  7      FROM sales,
  8        products
  9      WHERE sales.product_id=products.product_id
 10      GROUP BY customer_ID
 11      ORDER BY customer_ID DESC;
 12    prod NUMBER;
 13    quan NUMBER(10);
 14    pri  NUMBER(10);
 15    c_id NUMBER(10);
 16  BEGIN
 17    OPEN cur;
 18    LOOP
 19      FETCH cur INTO quan,pri,c_id;
 20      EXIT
 21    WHEN cur%notfound;
 22      prod:=pri*quan;
 23      DBMS_OUTPUT.PUT_LINE('customer_id =' || c_id);
 24      DBMS_OUTPUT.PUT_LINE('quantity value =' || quan);
 25      DBMS_OUTPUT.PUT_LINE('price =' || pri);
 26      DBMS_OUTPUT.PUT_LINE('The total value of customer purchases is = ' || prod);
 27    END LOOP;
 28    CLOSE cur;
 29  END;
 30  /
customer_id =5
quantity value =6
price =621
The total value of customer purchases is = 3726
customer_id =4
quantity value =23
price =3000
The total value of customer purchases is = 69000
customer_id =3
quantity value =166
price =3035
The total value of customer purchases is = 503810
customer_id =1
quantity value =688
price =3121
The total value of customer purchases is = 2147248

PL/SQL procedure successfully completed.

SQL>

顺便说一句,整个 PL/SQL 块可以用纯 SQL 编写。

使用 SQL

SQL> SELECT SUM(sales.quantity) AS "quantity",
  2    SUM(products.price) AS "price",
  3    sales.customer_ID
  4  FROM sales,
  5    products
  6  WHERE sales.product_id=products.product_id
  7  GROUP BY customer_ID
  8  ORDER BY customer_ID DESC;

  quantity      price CUSTOMER_ID
---------- ---------- -----------
         6        621           5
        23       3000           4
       166       3035           3
       688       3121           1

SQL>

更新 OP 希望根据用户输入过滤行。

SQL*Plus中,您可以声明一个变量并在过滤谓词中使用它:

SQL> variable cust_id NUMBER
SQL> EXEC :cust_id:= 4

PL/SQL procedure successfully completed.

不,让我们在过滤谓词中使用上面的变量

SQL> SET serveroutput ON
SQL> DECLARE
  2    CURSOR cur
  3    IS
  4      SELECT SUM(sales.quantity),
  5        SUM(products.price),
  6        sales.customer_ID
  7      FROM sales,
  8        products
  9      WHERE sales.product_id=products.product_id
 10      AND sales.customer_ID = :cust_id
 11      GROUP BY customer_ID
 12      ORDER BY customer_ID DESC;
 13    prod NUMBER;
 14    quan NUMBER(10);
 15    pri  NUMBER(10);
 16    c_id NUMBER(10);
 17  BEGIN
 18    OPEN cur;
 19    LOOP
 20      FETCH cur INTO quan,pri,c_id;
 21      EXIT
 22    WHEN cur%notfound;
 23      prod:=pri*quan;
 24      DBMS_OUTPUT.PUT_LINE('customer_id =' || c_id);
 25      DBMS_OUTPUT.PUT_LINE('quantity value =' || quan);
 26      DBMS_OUTPUT.PUT_LINE('price =' || pri);
 27      DBMS_OUTPUT.PUT_LINE('The total value of customer purchases is = ' || prod);
 28    END LOOP;
 29    CLOSE cur;
 30  END;
 31  /
customer_id =4
quantity value =23
price =3000
The total value of customer purchases is = 69000

PL/SQL procedure successfully completed.

SQL>

如果您想从前端应用程序执行此操作,您可以将整个逻辑放入 PROCEDURE 并接受 customer_id 作为 IN 参数。并在过滤谓词中使用它。

【讨论】:

  • 非常感谢.. 最后一个问题,我怎样才能让最终用户输入客户 ID 并且输出将是输入的那个 ID?
  • 那么你需要使用Procedure来拥有INPUT参数。然后将此输入参数用作谓词中的 绑定变量 来过滤行。或者,在 SQL*Plus 中,您可以为 SQL 使用 substitution variable
  • @Shak 请将其标记为已回答,对其他人有帮助。
  • 我真的不知道如何使用它.. 我尝试了这个语句,但不知道如何使它适合客户 ID IN (SELECT product_id FROM sales where customer_id=&Customer ID) 的代码请帮助我@Lalit Kumar B
  • 请就这个问题提出建议stackoverflow.com/questions/31385608/…
【解决方案3】:

您可以使用 sum() 函数,例如 select sum(sales.quantity) 而不是 sales-quantity。这将为您提供该 customer_id 的总数量

【讨论】:

    【解决方案4】:
    DECLARE
    

    //声明变量的

    a   NUMBER;
    b  NUMBER;
    Cal NUMBER;
    
    PROCEDURE calcul (a IN NUMBER,b     IN NUMBER,Cal   OUT NUMBER)IS
    

    // 检查 IF 条件,如果 a 不等于 b ,则添加 a 和 B 开始

            IF a <> b THEN
                Cal := a + b;
            END IF;
      END;
    

    // 将值传递给 a 和 b 然后调用计算过程将进行加法。

       BEGIN
        a := 10;
        b := 15;
        calcul(a,b,Cal);
        dbms_output.put_line('Sum is ' || Cal);
       END;
    

    【讨论】:

    • 请编辑以包含解释此代码如何工作的小注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多