Как рассчитать сумму строк, имеющих одинаковый идентификатор? - PullRequest
0 голосов
/ 13 января 2019

Мне нужно создать функцию, которая возвращает окончательное усиление продукта. Моя проблема в том, что для каждого PRODUCT_ID, который обрабатывается более 10 дней, мне нужно добавить (дней * 0,0001) к цене продукта. Многие ORDER_ID имеют разные PRODUCT_ID. Я не могу придумать способ сделать это в той же функции. Куда мне добавить умножение? Схема базы данных выглядит следующим образом

enter image description here

Я пробовал двойной цикл и СУММ, но ни один из них не работал.

CREATE OR REPLACE FUNCTION get_gain(orderID NUMBER)
  RETURN NUMBER
  AS
    total_price   NUMBER;
    total_cost    NUMBER;
    gain    NUMBER;

    Cursor cur1 IS
    SELECT SUM(PRICE) AS "Total PRICE"
    FROM ORDERS
    WHERE ORDER_ID=orderID;
    Cursor cur2 IS
    SELECT SUM(COST) AS "Total COST"
    FROM ORDERS
    WHERE ORDER_ID=orderID;

BEGIN
   OPEN cur1;
   FETCH cur1 INTO total_price;
   CLOSE cur1;
   OPEN cur2;
   FETCH cur2 INTO total_cost;
   CLOSE cur2;
   gain := total_price - total_cost;
   RETURN gain;

END;

1 Ответ

0 голосов
/ 13 января 2019

Вы можете использовать следующий подход для построения вашего запроса. Я полагаю, что вам не понадобится какая-либо функция для этой операции

SELECT
  ORDER_ID,
  ...
  CASE WHEN DAYS_TO_PROCESS > 10 THEN
     PRICE + DAYS_TO_PROCESS * 0.0001 
  ELSE
     PRICE
  END AS PRICE
FROM table1
WHERE ...

Не ясно, чего вы пытаетесь достичь. пожалуйста, предоставьте более подробную информацию.

Вот пример функции для обновления цены продукта

CREATE OR REPLACE FUNCTION UpdatePrice(orderID NUMBER)
  RETURN NUMBER
  AS
    total_price   NUMBER;
    total_cost    NUMBER;
    gain    NUMBER;
BEGIN
  UPDATE table1 
  SET PRICE = 
    CASE WHEN DAYS_TO_PROCESS > 10 THEN
       PRICE + DAYS_TO_PROCESS * 0.0001 
    ELSE
       PRICE
    END
  WHERE ORDER_ID = p_ORDER_ID;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...