2011-02-03 72 views
2

我有问题正确计算每个项目的税和折扣,主要是因为我不确定订单应该是什么。我可以在没有任何问题的情况下在计算器上执行此操作,但编写SQL是另一回事。整个专栏由朋友完成,并按预期工作。根据他的总列,我添加了taxtotal列,这似乎给出了正确的结果。尽管如此,我仍然遇到了折扣问题。帮助计算税和折扣

有2个折扣栏。一种是可以在清单中设置的初始折扣以及店员可以应用的第二种折扣。折扣栏为op.discountp.discount。没有单独的折扣表,只是两个连接中的列。

我想确保我的taxtotal列是正确的,所以如果有人看到一个问题或更好的写作方式,我会欣赏任何建议。

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

我想你的意思

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

有额外的括号,因为multiply has a higher precedence than add - 假设这些都是个折扣?

+0

RUP您好,感谢。折扣价值以十进制格式存储:.5我现在就试试这个。谢谢。 – Jim 2011-02-03 11:20:47

+0

嗯,好的 - 那么你可能不想在这里使用`/ 100`。但也许我误解了。 (如果他们是绝对的折扣,即.5意味着50美分不是50%,那么我误解了!) – Rup 2011-02-03 11:23:08