2012-09-27 63 views
2

我在我的庫存數據庫中有2個值。一個是QtyOnHand(浮動),另一個是對該項目的所有庫存交易的計算(認爲SUM(TransQty),其中transQty也是浮動)。問題是,隨着時間的推移,出於未知的原因,其中一些值不同步。所以現在我正在嘗試清理它們。SQL使用長浮點數的數學問題,算術

基本上,我正在使用QtyOnHand(我們聲明爲準確),並從中減去交易總數。然後針對差異對交易進行更正。這很有效,直到我們得到大量「十進制灰塵」的數字。此外,即使在實際值更像0.0000000000000000237的情況下,float也顯示0

以下是一些我無法糾正的數據。

Example Data

用科學記數法的項目是給我找麻煩。即使是顯示項目PLXL-105-H(顯示-18,-18)的行顯示不準確,因爲我的查詢只返回1%不匹配之外的值。我一直在使用TSQL,它是否有助於操縱C#程序中的值?

所以,這是我的問題:我應該如何處理這些數字?我試過將它們轉換爲DECIMAL(38,38),但那給了我算術溢出。我需要獲得表示差異的準確值,然後使用該值來平衡事情。

+0

現實生活中的精確度是什麼意思? – Randy

+0

@蘭迪 - 沒什麼,我們工作的最小單位是.1(1/10)。 – MAW74656

+0

當您的當前值的絕對值小於1時,您是否可以將transbal更新爲零? – Randy

回答

1

你打算如何進入?

做這樣的事情:

with to_update as (
    select itemNumber, QtyOnHand, TransBal 
    from t 
) 
update tb_table 
    set offset = TransBal - QtyOnHand 
    from to_update 
    where to_udpate.itemNumber = tb_table.itemNumber 

應該做的伎倆。

我聽起來好像你正試圖從數據庫中取出數據,操縱它,然後再將它放回去。如果你呆在數據庫中,你不會有問題,因爲值永遠不會被轉換字符串。

順便說一句,對於十進制轉換,你應該使用decimal(38,19)什麼的。刻度參數是小數點右側的位數,因此將它設置爲38僅表示-1和1之間的數字。

+1

這個問題被標記爲sql-server-2000,所以CTE不會在這裏工作。雖然,「DECIMAL」的好點。 – Lamak

+0

那麼,我肯定是使用十進制錯誤。但我並沒有試圖將數據從數據庫中提取出來,然後放回數據庫,這只是一個側面問題(會更好嗎?)。正如我在OP中所說的,我完全在TSQL,SQL Server 2000中工作。 – MAW74656

+0

@ Lamak- True,但我在做類似的邏輯,只是使用變量來存儲信息。 – MAW74656