Проблема с функцией SQL - PullRequest
1 голос
/ 30 июля 2009

у меня есть функция

CREATE OR REPLACE FUNCTION Total_order_price 
     (p_order#  IN NUMBER) 
RETURN NUMBER 
IS 
  l_total_order_amount  NUMBER := 0; 
BEGIN 
  SELECT Sum(fo.n_portions * di.price) + Sum(do.n_units * dr.price) AS total_order_price 
  INTO   l_total_order_amount 
  FROM   customer_order co, 
         food_order fo, 
         drink_order do, 
         dish di, 
         drink dr 
  WHERE  co.order# = fo.order# 
         AND fo.dish# = di.dish# 
         AND co.order# = do.order# 
         AND do.drink# = dr.drink# 
         AND co.order# = p_order#; 

  RETURN l_total_order_amount; 
END; 
/
select total_order_price(1) from dual;

Это означает суммирование суммы заказа, когда я запускаю его в sql developer, используя заказ 1, я получаю это:

TOTAL_ORDER_PRICE(1)   
---------------------- 
622.5          

но это должно быть 207.50.

Вот данные таблицы и создание таблицы:

create table Customer_order( order# NUMBER primary key , 
date_order    DATE,
  date_required DATE,
  address       VARCHAR2(30)
  );
CREATE  TABLE Dish (
  dish#      VARCHAR2(5) primary key,
  dish_name  CHAR(15),
  vegetarian CHAR(3),
  price      NUMBER);

 CREATE  TABLE Drink (
  drink#     VARCHAR2(6) primary key,
  drink_name CHAR(6),
  drink_type CHAR(9),
  price      NUMBER);

CREATE  TABLE Food_order (
  food_order# VARCHAR2(7) primary key,
  order#      number references Customer_order (order#) ,
  dish#       VARCHAR2(5) references Dish(Dish#),
  n_portions  NUMBER);

CREATE  TABLE Drink_order (
  drink_order# VARCHAR2(5)primary key,
  order#       number references Customer_order (order#),
  drink#       VARCHAR2(6)references drink (drink#),
  n_units      NUMBER);


-- data insert
Insert into customer_order values ('00001', '03-Apr-09', '07-apr-09','St. Andrew St'); 
Insert into customer_order values ('00002', '05-Apr-09', '01-May-09', 'St. Andrew St');
Insert into customer_order values ('00003', '12-Apr-09', '27-Apr-09', 'Union St');
Insert into customer_order values ('00004', '12-Apr-09', '17-Apr-09', 'St. Andrew St');

Insert into Dish values ('D0001', 'Pasta bake',      'yes', '6.00'); 
Insert into Dish values ('D0002', 'Fish pie',        'no',  '9.00');  
Insert into Dish values ('D0003', 'Steak and chips', 'no',  '14.00');   
Insert into Dish values ('D0004', 'Stuffed peppers', 'yes', '11.50');   
Insert into Dish values ('D0005', 'Ham and rice'   , 'no',  '7.25');  
Insert into Dish values ('D0006', 'Lamb curry'     , 'no',  '8.50'); 

Insert into Drink values ('DR0001', 'Water',  'soft',      '1.0');
Insert into Drink values ('DR0002', 'Coffee', 'hot',       '1.70');
Insert into Drink values ('DR0003', 'Wine'  , 'alcoholic', '3.00'); 
Insert into Drink values ('DR0004', 'Beer'  , 'alcoholic', '2.30');  
Insert into Drink values ('DR0005', 'Tea'   , 'hot'     ,  '1.50');   

Insert into food_order values ('F000001', '000001', 'D0003', '6');
Insert into food_order values ('F000002', '000001', 'D0001', '4');
Insert into food_order values ('F000003', '000001', 'D0004', '3');
Insert into food_order values ('F000004', '000002', 'D0001', '10');
Insert into food_order values ('F000005', '000002', 'D0002', '10');
Insert into food_order values ('F000006', '000003', 'D0002', '35');
Insert into food_order values ('F000007', '000004', 'D0002', '23');

Insert into drink_order values ('D000001', '000001', 'DR0001', '13');
Insert into drink_order values ('D000002', '000001', 'DR0002', '13');
Insert into drink_order values ('D000003', '000001', 'DR0004', '13');
Insert into drink_order values ('D000004', '000002', 'DROOO1', '20');
Insert into drink_order values ('D000005', '000002', 'DR0003', '20');
Insert into drink_order values ('D000006', '000002', 'DR0004', '15');
Insert into drink_order values ('D000007', '000003', 'DR0002', '35');
Insert into drink_order values ('D000008', '000004', 'DR0001', '23'); 
Insert into drink_order values ('D000009', '000004', 'DR0003', '15');
Insert into drink_order values ('D0000010', '000004', 'DR0004', '15');

Так, что я должен сделать, чтобы получить 207.50 вместо 622.5?

Ответы [ 3 ]

1 голос
/ 30 июля 2009

Я не проверил данные подробно, но у вас, вероятно, есть что-то вроде двух заказов на напитки и двух заказов на еду, в результате чего в выборке 4 строки. Когда вы складываете все, вы пересчитываете заказы дважды.

Чтобы исправить это, сделайте два отдельных выбора, для заказов на еду, один для заказов на напитки. И добавьте результаты в процедуру или с помощью объединения.

1 голос
/ 30 июля 2009

Вы не имеете отношения 1 к 1 с записями в заказах на еду и заказы на напитки. Вот почему вам лучше иметь стол, чтобы хранить все заказанные предметы. Ваши таблицы блюд и напитков, кажется, одинаковы. Я бы положил их в одну таблицу и имел бы поле 'type' со значениями либо еды, либо питья.

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

1 голос
/ 30 июля 2009

Если у вас есть несколько заказов на напитки и несколько заказов на еду, объединения будут пересекаться умножайтесь, давая вам гораздо больше, чем вы хотели.

Это даст вам две части по отдельности, которые должны составить необходимую сумму:

SELECT Sum(fo.n_portions * di.price) AS food_order_price   
FROM   customer_order co,
          food_order fo,
          dish di,
WHERE  co.order# = fo.order#
          AND fo.dish# = di.dish#
          AND co.order# = p_order#; 

SELECT Sum(do.n_units * dr.price) AS drinks_order_price   
FROM   customer_order co,
          drink_order do,
          drink dr   
WHERE  co.order# = do.order#
          AND do.drink# = dr.drink#
          AND co.order# = p_order#; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...