[英]I am having trouble calculating the correct total of an invoice PL/SQL
I am trying to create a function and procedure which calculates the total cost for a specific car service. 我正在尝试创建一个功能和过程来计算特定汽车服务的总成本。 Listing all the individual cost of parts and the service cost, and producing a total which updates the invoice table.
列出所有单个零件成本和服务成本,并生成总计,以更新发票表。
I am currently experiencing a double charge for the service cost, I am thinking that there is problems with the logic as the total cost for all services are showing. 我目前正在对服务费用加倍收取费用,我认为所有服务的总费用都在显示逻辑上的问题。 I want to limit the part cost for each specific service.
我想限制每种特定服务的零件成本。
Here is a demo build of my databases which I have created on SQL+. 这是我在SQL +上创建的数据库的演示版本。
SERVICE
CREATE TABLE SERVICE
(SERVICE_ID VARCHAR2 (3) PRIMARY KEY,
DATE_OF_SERVICE DATE NOT NULL,
TIME VARCHAR2 (8)NOT NULL,
STAFF_RECORDED VARCHAR2 (3)NOT NULL,
STAFF_SERVICING VARCHAR2 (3)NOT NULL,
SERVICE_TYPE_ID VARCHAR2 (1)NOT NULL,
CAR_ID VARCHAR2 (3)NOT NULL,
BRANCH_ID VARCHAR2 (3)NOT NULL);
INSERT INTO SERVICE VALUES ('01', '14/JAN/2013', '11.15', '01', '06', '1', '01','01');
INSERT INTO SERVICE VALUES ('02','14/JAN/2013', '11.15', '01', '06', '1', '01','01');
PART_SERVICE
CREATE TABLE PART_SERVICE
(PART_ID VARCHAR2 (3),
SERVICE_ID VARCHAR2 (3));
INSERT INTO PART_SERVICE VALUES ('01', '01');
INSERT INTO PART_SERVICE VALUES ('02', '01');
INVOICE
CREATE TABLE INVOICE
(INVOICE_ID VARCHAR2 (3) PRIMARY KEY,
CUSTOMER_ID VARCHAR2 (3),
SERVICE_ID VARCHAR2 (3),
TOTAL_COST NUMBER (10,2));
INSERT INTO INVOICE VALUES ('01', '01', '01',NULL);
CREATE TABLE SERVICE_TYPE
(SERVICE_TYPE_ID VARCHAR2 (1) PRIMARY KEY,
SERVICE_NAME VARCHAR2 (15)NOT NULL,
SERVICE_COST NUMBER (5,2)NOT NULL);
INSERT INTO SERVICE_TYPE VALUES ('1', 'FULL SERVICE', 140.00);
PART
CREATE TABLE PART
(PART_ID VARCHAR2(3) PRIMARY KEY,
PART_NAME VARCHAR2 (20)NOT NULL,
PART_TYPE VARCHAR2 (20)NOT NULL,
PART_PRICE NUMBER (5,2)NOT NULL);
INSERT INTO PART VALUES ('01', 'ABS sensors', 'Electrical', '200.00');
INSERT INTO PART VALUES ('02', 'Light bulbs', 'Electrical', '50.00');
SET SERVEROUTPUT ON
SET ECHO ON
CREATE OR REPLACE FUNCTION INVOICE_TOTAL
(i_invoice invoice.invoice_id%TYPE)
RETURN NUMBER
IS
v_invoice_total invoice.total_cost%TYPE;
BEGIN
SELECT SUM(NVL(PART_PRICE+SERVICE_COST,0))
INTO v_invoice_total
FROM SERVICE, PART, SERVICE_TYPE, PART_SERVICE
WHERE SERVICE_TYPE.SERVICE_TYPE_ID = SERVICE.SERVICE_TYPE_ID
AND PART.PART_ID = PART_SERVICE.PART_ID
AND SERVICE.SERVICE_ID = PART_SERVICE.SERVICE_ID
AND SERVICE.SERVICE_ID = i_invoice;
IF v_invoice_total IS NULL THEN
v_invoice_total := 0;
END IF;
RETURN v_invoice_total;
END;
/
CREATE OR REPLACE PROCEDURE TOTALCOST
AS
CURSOR c_invoice
IS
SELECT SERVICE_ID
FROM SERVICE;
v_invoice invoice.invoice_id%TYPE;
v_invoice_total_cost invoice.total_cost%TYPE;
BEGIN
OPEN c_invoice;
LOOP
FETCH c_invoice INTO v_invoice;
EXIT WHEN c_invoice%NOTFOUND;
v_invoice_total_cost := INVOICE_TOTAL(v_invoice);
UPDATE invoice
SET total_cost = v_invoice_total_cost
WHERE invoice_id = v_invoice;
DBMS_OUTPUT.PUT_LINE('PART PRICE:'|| TO_CHAR(v_invoice_total_cost));
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total = '|| TO_CHAR(v_invoice_total_cost));
CLOSE c_invoice;
END;
/
exec TOTALCOST;
The actual output is: 实际输出为:
PART PRICE:530
PART PRICE:0
PART PRICE:0
PART PRICE:0
PART PRICE:0
Total = 0
What I am trying to get: 我想要得到的是:
SERVICE = '01'
PART PRICE = 200
PART PRICE = 50
SERVICE PRICE = 140
Total Price: 390
I think the problem is in your seed data. 我认为问题出在您的种子数据中。 You have this:
你有这个:
CREATE TABLE PART_SERVICE
(PART_ID VARCHAR2 (3),
SERVICE_ID VARCHAR2 (3));
INSERT INTO PART_SERVICE VALUES ('01', '01');
INSERT INTO PART_SERVICE VALUES ('02', '01');
But I think the second insert is transposing the values, and you meant to do this: 但是我认为第二个插入是对值进行转置,而您打算这样做:
INSERT INTO PART_SERVICE VALUES ('01', '01');
INSERT INTO PART_SERVICE VALUES ('01', '02'); -- swapped values.
Please change the JOINs in your function to as shown below, it makes it more readable. 请将函数中的JOIN更改为如下所示,这使它更具可读性。
Because your query will have two PARTS
the SERVICE_TYPE
table row will be added twice if you write it that way (explaining the additional 140). 因为您的查询将包含两个
PARTS
所以如果以这种方式编写,则SERVICE_TYPE
表行将被添加两次(解释附加的140)。
Your function must be something like 您的功能必须类似于
SELECT x.PartCost + st.SERVICE_COST
INTO v_invoice_total
FROM SERVICE_TYPE st
JOIN (
SELECT SUM(PART_PRICE) [PartCost], s.SERVICE_ID, s.SERVICE_TYPE_ID
FROM SERVICE s
JOIN PART_SERVICE ps ON s.SERVICE_ID = ps.SERVICE_ID
JOIN PART p ON ps.PART_ID = p.PART_ID
GROUP BY s.SERVICE_ID, s.SERVICE_TYPE_ID
) as x ON x.SERVICE_TYPE_ID = st.SERVICE_TYPE_ID
跌倒/ sql要求您大跌幅,如果小跌幅将无法做到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.