2017-07-30 1 views
1

J'ai une requête qui incorpore des champs calculés. La colonne "Total" produit une valeur avec 2 décimales, mais les colonnes Commission et Net_Receipt ont 4 positions décimales malgré le fait que le code recherche exactement le même format. Quelqu'un peut-il me dire pourquoi et comment corriger les deux derniers à 2 DP.Puzzle Décimales

SELECT `exhibition_sales`.`name`, 
     `exhibition_sales`.`category`, 
     `exhibition_sales`.`catologue_number`, 
     `exhibition_sales`.`title`, 
     `exhibition_sales`.`quantity`, 
     `exhibition_sales`.`unit_price`, 
     `exhibition_sales`.`commision_rate`, 
     `exhibition_sales`.quantity * `unit_price` AS `Total`, 
     `exhibition_sales`.quantity * `commision_rate` * unit_price AS `Commision`, 
     `exhibition_sales`.quantity * `unit_price` - `quantity` * `unit_price` * `commision_rate` AS `Net_Receipt` 
FROM exhibition_sales 
ORDER BY `exhibition_sales`.`name` ASC 

enter image description here

+1

Le nombre de décimales doit être géré dans la couche de présentation. La base de données donne des nombres, pas des données formatées. Il peut y avoir des définitions pour la précision dans la base de données, mais cela ne change pas où la présentation devrait être faite. Très probablement les définitions de colonnes ont des précisions différentes mais vous ne les avez pas montrées. –

+0

Je ne suis pas sûr qu'il y ait vraiment une question ici. Si vous perdez _precision_ (c'est-à-dire si les données sont tronquées, etc.), cela peut être source de préoccupation. –

+0

Répondez ci-dessous. D'ailleurs: S'il vous plaît ne pas stocker la monnaie dans un numérique. Cela échouera toujours. Ne prétends pas que ce n'est pas le cas. Stockez l'unité la plus basse, c'est-à-dire: cents, sous la forme d'un entier. – user2722968

Répondre

0

Les règles pour le format de sortie de décimales est très alambiquée. Si vous voulez un nombre particulier, puis juste jeter au format que vous voulez:

select . . ., 
     cast(`exhibition_sales`.quantity * `commision_rate` * unit_price as decimal(10, 2)) AS `Commision`, 
     cast(`exhibition_sales`.quantity * `unit_price` - `quantity` * `unit_price` * `commision_rate` as decimal(10, 2)) AS `Net_Receipt` 

Il y a une explication dans le documentation.

+0

Un grand merci Gordon qui m'a fait gagner beaucoup de temps et travaille un régal. –

0

En supposant que vous êtes sur SQL Server, le rules of multiplication and division with numerics appliquent:

  • Total est la multiplication d'un (x, 0) -value avec un (x, 2) -value, donc l'échelle finale sera est 0 = 2 + 2 = 2. Donc 5 * 2.00 == 10.00
  • Commission est la multiplication d'une valeur (x, 0), d'une valeur (x, 2) et d'une valeur (x, 2) de sorte que l'échelle finale sera (0 + 2) 2 = 4. Par conséquent 5 * 2.00 * 4.00 == 40.0000
  • Net_Receipt est la somme des deux multiplications; l'échelle finale sera max (s1 + s2, s3 + s4), c'est-à-dire max(0 + 2, 2 + 2) == 4. Par conséquent 5 * 2.00 + 1.00 * 3.00 == 13.0000
+0

J'ai vu cette connexion mais je ne pouvais pas comprendre pourquoi, merci pour l'explication complète. Cela soulève la question si cela est progressif, les multiplications deviennent de plus en plus complexes! Merci pour votre réponse il est apprécié –