2011-02-03 3 views
2

У меня возникают проблемы с правильным расчетом налогов и скидок на каждый предмет, главным образом потому, что я не уверен, что должен делать заказ. Я могу сделать это на калькуляторе без проблем, но писать SQL - это совсем другая история. Общая колонка была сделана другом и работает, как ожидалось. Основываясь на его общей колонке, я добавил столбец taxtotal, который, кажется, дает правильный результат. Тем не менее, у меня все еще проблема со скидками.Помогите рассчитать налог и скидки

Есть 2 колонки скидки. Одна из них - это первоначальная скидка, которая может быть установлена ​​в инвентаре и вторая скидка, которую может применить клерк. Колонки для скидок - op.discount и p.discount. Нет отдельной таблицы для скидок и являются только столбцами в двух объединениях.

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

SELECT 
    p.tax_state as tax_state, 
    p.tax_fed as tax_fed, 
    p.price AS price, 
    op.quantity AS quantity, 
    op.discount AS discount, 
    (p.tax_state + p.tax_fed) AS tax, 
    ((p.tax_state + p.tax_fed)/100) * (p.price * op.quantity - (p.price * op.quantity * op.discount + p.discount /100)) AS taxtotal, 
    (p.price * (1 + ((p.tax_state + p.tax_fed)/100)) * (1.0 - op.discount) * op.quantity) AS total 
FROM pos_order o 
JOIN pos_item_order op ON op.order_id = o.order_id 
JOIN inv_item p ON p.item_id = op.item_id 

ответ

1

если вы можете создать функцию сделать

 

SELECT 
    p.tax_state as tax_state, 
    p.tax_fed as tax_fed, 
    p.price AS price, 
    op.quantity AS quantity, 
    op.discount AS discount, 
    (p.tax_state + p.tax_fed) AS tax, 
    taxtotal(p.tax_state , p.tax_fed, p.price ,op.quantity, op.discount) AS taxtotal 
    valueTotal(p.tax_state , p.tax_fed, p.price ,op.quantity, op.discount) AS total 
FROM pos_item_order op 
JOIN inv_item p ON p.item_id = op.item_id 

 

создать эту функцию

 

DROP FUNCTION IF EXISTS `taxtotal`; 
CREATE DEFINER=`root`@`localhost` FUNCTION `taxtotal`(`tax_state` double,`tax_fed` double,`price` double,`quantity` INT,`discount` double) RETURNS double 
BEGIN 
    RETURN ((`tax_state` + `tax_fed`)/100) * (`price` * `quantity` - (`price` * `quantity` * `discount`/100)); 
END 
;; 
DELIMITER ; 
DROP FUNCTION IF EXISTS `valueTotal`; 
CREATE DEFINER=`root`@`localhost` FUNCTION `valueTotal`(`tax_state` double,`tax_fed` double,`price` double,`quantity` INT,`discount` double) RETURNS double 
BEGIN 
    RETURN (p.price * (1 + ((p.tax_state + p.tax_fed)/100)) * (1.0 - op.discount) * op.quantity); 
END 
;; 
DELIMITER ; 
 
+0

. Я тестирую ее. он работает правильно. Вы только один раз создаете эту функцию и всегда можете использовать эту функцию. – AmirModiri

+0

Hi Amir. Спасибо за функцию. По какой-то причине я не могу загрузить его. По какой-то причине я получаю синтаксическую ошибку в строке 3. – Jim

+0

Амир, не могли бы вы помочь мне со скидкой? Я не уверен, как это написать. – Jim

0

Я думаю, что вы имеете в виду

(p.price * op.quantity * ((op.discount + p.discount)/100)) 

с дополнительными скобками, потому что multiply has a higher precedence than add - если они оба процентных скидок?

+0

Привет Rup, спасибо. Значения скидок хранятся в десятичном формате: .5 Я попробую сейчас попробовать. Благодарю. – Jim

+0

Ах, ОК - вы, вероятно, не хотите здесь '/ 100'. Но, может быть, я неправильно понял. (Если они абсолютные скидки, то есть .5 означает 50 центов не 50%, то я неправильно понял!) – Rup

+0

Rup, я не уверен, что результат правильный или нет. Вот что у меня есть. У меня есть первоначальная скидка 0,1 и прикладная скидка 0,1 на 0,2 или 2% от 9,99 долларов США. Возврат вашего кода равен 0,021. Это верно? – Jim

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