2011-02-03 2 views
2

J'ai des problèmes pour calculer correctement les taxes et les remises par article, principalement parce que je ne suis pas certain de ce que l'ordre devrait être. Je peux le faire sur une calculatrice sans aucun problème mais écrire le SQL est une histoire différente. La colonne totale a été faite par un ami et fonctionne comme prévu. Basé sur sa colonne totale, j'ai ajouté la colonne taxtotal qui semble donner le bon résultat. J'ai toujours un problème avec les réductions.Aide au calcul de la taxe et des réductions

Il existe 2 colonnes de remise. L'un est un rabais initial qui peut être fixé dans l'inventaire et un deuxième rabais qui peut être appliqué par le greffier. Les colonnes pour les remises sont op.discount et p.discount. Il n'y a pas de tableau séparé pour les remises et il n'y a que des colonnes dans les deux jointures. Je voudrais m'assurer que ma colonne taxtotale est correcte ainsi si quelqu'un voit un problème ou une meilleure manière de l'écrire, j'apprécierais n'importe quelles suggestions.

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 

Répondre

1

si vous pouvez créer ce faire fonction

 

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 

 

créer cette fonction

 

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

je le tester. cela fonctionne correctement. vous juste une fois créer cette fonction et pouvez toujours utiliser cette fonction – AmirModiri

+0

Salut Amir. Merci pour la fonction. Pour une raison quelconque, je ne peux pas le charger. Je reçois une erreur de syntaxe sur la ligne 3 pour une raison quelconque. – Jim

+0

Amir, pourriez-vous s'il vous plaît m'aider avec la réduction? Je ne suis pas sûr de savoir comment écrire cela. – Jim

0

Je pense que vous voulez dire

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

avec des accolades supplémentaires parce multiply has a higher precedence than add - en supposant que ce sont deux rabais en pourcentage?

+0

Salut Rup, merci. Les valeurs des remises sont stockées au format décimal: .5 Je vais essayer maintenant. Merci. – Jim

+0

Ah, OK - vous ne voulez probablement pas le '/ 100' ici alors. Mais peut-être que j'ai mal compris. (Si elles sont des remises absolues, c'est-à-dire 5 centimes 50 centimes non 50% alors j'ai mal compris!) – Rup

+0

Rup, je ne suis pas certain de la sortie est correcte ou non. Voici ce que j'ai. J'ai une réduction initiale de .1 et une réduction appliquée de .1 totalisant 0,2 ou 2% de 9,99 $. Ce que votre code renvoie est 0.021. Est-ce correct? – Jim

Questions connexes