Sql 帮助计算税收和折扣

Sql 帮助计算税收和折扣,sql,mysql,Sql,Mysql,我在正确计算每件商品的税费和折扣时遇到问题,主要是因为我不确定订单应该是什么。我可以在计算器上完成这项工作,没有任何问题,但是编写SQL是另一回事。total专栏是由一位朋友完成的,效果如预期。基于他的total列,我添加了taxtotal列,它似乎给出了正确的结果。不过,我仍然对折扣有意见 有两个折扣栏。一个是可以在库存中设置的初始折扣,另一个是可以由职员应用的第二个折扣。折扣的列是op.discount和p.discount。没有单独的折扣表,只是两个联接中的列 我想确保我的taxtotal

我在正确计算每件商品的税费和折扣时遇到问题,主要是因为我不确定订单应该是什么。我可以在计算器上完成这项工作,没有任何问题,但是编写SQL是另一回事。total专栏是由一位朋友完成的,效果如预期。基于他的total列,我添加了taxtotal列,它似乎给出了正确的结果。不过,我仍然对折扣有意见

有两个折扣栏。一个是可以在库存中设置的初始折扣,另一个是可以由职员应用的第二个折扣。折扣的列是
op.discount
p.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
我想你是说

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

因为-假设这两个都是百分比折扣?

如果可以创建函数,请执行此操作


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 ;

你好,谢谢。折扣值以十进制格式存储:.5我现在尝试一下。谢谢。啊,好吧-那么你可能不想把
/100
放在这里。但也许我误解了。(如果它们是绝对折扣,即5意味着50美分而不是50%,那么我误解了!)Rup,我不确定输出是否正确。这是我的。我的初始折扣为.1,应用折扣为.1,总计为.2或9.99美元的2%。代码返回的值是0.021。这是正确的吗?好的,在不使用
/100
的情况下运行代码,现在可以得到2.1。我想四舍五入会给我2,对吗?不应该-我复制了你添加的折扣,而不是复合折扣。还是应该复合?我不确定。不过,你应该和你的生意人谈谈预期的答案应该是什么。我测试一下。它工作正常。您只需创建一次此函数,就可以随时使用此函数。谢谢你的功能。由于某种原因,我无法将其加载。由于某种原因,我在第3行遇到语法错误。阿米尔,你能帮我打折吗?我不知道该怎么写。如果在尝试(p.price*op.quantity*((op.discount+p.discount)/100)时,折扣列的小数点带有值,那么折扣列的类型是什么?例如:选择(1000*1*((1+1)/100))它可以正常工作,返回20表示1000的2%