2017-07-30 105 views
1

我有一個包含一些calcualted字段的查詢。 「總計」列產生一個有2位小數的值,但委員會和Net_Receipt列有4位小數,儘管代碼格式完全相同。任何人都可以告訴我爲什麼以及如何糾正後兩個2 DP。小數位拼圖

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

應在表示層中處理小數位數。數據庫提供數字,而不是格式化數據。數據庫中可能存在精確度的定義,但在演示應完成的地方不會改變。列定義最有可能具有不同的精度,但您沒有顯示它們。 –

+0

我不確定這裏真的有問題。如果你正在失去_precision_(即如果數據被截斷等),那麼它可能是值得擔心的。 –

+0

下面的答案。此外:請不要將貨幣存儲在數字中。它總是會失敗。不要假裝自己沒有。將最小單位存儲,即:美分,作爲整數。 – user2722968

回答

0

爲小數的輸出格式的規則是非常令人費解。如果你想要一個特定的號碼,然後只投給你想要的格式:

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` 

有一個在documentation一些解釋。

+0

非常感謝Gordon爲我節省了很多時間,併爲我提供了一種享受。 –

0

假設你的SQL Server上的應用rules of multiplication and division with numerics

  • Total是相乘(X,0) - 值用(X,2) - 值,所以最終的規模將因此5 * 2.00 == 10.00
  • Commission是a(x,0) - 值,a(x,2) - 值和(x,2) - 值的乘積,因此最終的比例將是(x, 0 + 2)+2 = 4。因此5 * 2.00 * 4.00 == 40.0000
  • Net_Receipt是兩次乘法的總和;最終比例將爲max(s1 + s2,s3 + s4),即max(0 + 2, 2 + 2) == 4。因此5 * 2.00 + 1.00 * 3.00 == 13.0000
+0

我確實看到了這個連接,但不明白爲什麼非常感謝您的完整解釋。它確實提出這樣的問題,如果這是漸進的,則乘法變得越來越複雜!感謝您的回覆,非常感謝 –