2015-07-13 4 views
1

Я пытаюсь получить инструкцию PLSQL для отображения всего списка идентификаторов клиентов и суммы стоимости заказа для каждого клиента. следующий код возвращает мне правильный ответ, но проблема в том, что у меня есть несколько клиентов с одинаковым идентификатором, и мне нужно суммировать все их значения порядка только с одним выводом ID, а не с кодом multiple.my, который получает множительный результат для одного и того же клиента.сумма общих значений PL/Sql

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 

простите пожалуйста.

+3

Пожалуйста, предоставьте инструкцию create table и убедитесь, что вы добавили INSERT в предложение table_name, которое он вставляет инструкции. И вам действительно нужно использовать 'PL/SQL'?Это можно сделать в простом 'SQL'. PL/SQL 'LOOP',' row-by-row' a.k.a. 'slow-by-slow'. –

+0

изменений сделано и да Мне нужно получить его pl/sql ,, код готов Мне просто нужна сумма одинаковых идентификаторов клиентов по 1 вывод – Shak

+1

Каков результат, который вы ожидаете, и почему у вас есть " сделать это в PL/SQL? Обновите свой вопрос с ожидаемым результатом. – Boneist

ответ

1

Вам просто нужно использовать SUM в качестве агрегатной функции с помощью GROUP BY.

Использование 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> 

Update 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> 

Если вы хотите сделать это из внешнего приложения, вы можете поместить всю логику в ПРОЦЕДУРА и принять customer_id как IN параметр. И используйте его в предикате фильтра.

+0

Большое спасибо .. последний вопрос. Как я могу разрешить конечному пользователю вводить идентификатор клиента, и выход будет для введенного идентификатора? – Shak

+0

Затем вам нужно использовать процедуру, чтобы иметь параметры INPUT. Затем используйте этот входной параметр как ** bind variable ** в предикате для фильтрации строк. Или, в SQL * Plus, вы можете использовать ** переменную подстановки ** для SQL. –

+0

@Shak Пожалуйста, отметьте это как ответ, помогли бы другим. –

0

Вы можете использовать функцию sum(), например, выбрать сумму (sales.quantity) вместо количества продаж. Это даст вам общее количество для этого Customer_ID

2

Попробуйте

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. 
+0

Прошу совета по этому вопросу http://stackoverflow.com/questions/31385608/update-table-pl-sql?noredirect1_comment50748585_31385608 – Shak

+0

жаль, что я здесь новый, и я не знаю, что вы имеете в виду, приняв ответ .. Спасибо – Shak

+0

Вам нужно щелкнуть по метке «Тик», связанной с ответом ниже, который станет зеленым, и это будет означать, что это было полезно для вас. Итак, в следующий раз, если кто-то сталкивается с такой же проблемой, тогда они просто ищут принятый ответ. Пожалуйста, перейдите по этой ссылке, чтобы понять http://stackoverflow.com/tour – Ravi

0
DECLARE 

// объявляя

a NUMBER; 
b NUMBER; 
Cal NUMBER; 

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

// Проверяется условие, если не равен Ь, то он добавит и B НАЧАТЬ

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

// Passing переменной значения для a и b, которые вызывают процедуру вычисления, будут дополнять.

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

. Пожалуйста, отредактируйте, чтобы включить небольшой комментарий, объясняющий, как работает этот код. –

+0

отредактирован, спасибо. –

Смежные вопросы