2009-07-30 4 views
1

У меня есть функцияПроблема с функцией SQL

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?

+1

Что вы заказывали? – Fredou

ответ

1

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

Это даст вам две части по отдельности, которые должны добавить к вашей требуется всего:

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#; 
1

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

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

1

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

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

+0

вот как меня попросили сделать таблицы – 2009-07-30 15:38:09

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