2012-01-21 33 views
3

因此我想在SQL視圖中將另一個數字除以另一個數字。我將兩列分爲int類型,問題在於它給了我一個四捨五入的輸出,而不是一個精確的輸出。如何獲得SQL中的精確百分比calc

這是我的選擇

選擇了Numberone,numberTwo, (的Numberone * 100/NULLIF(numberTwo,0))作爲PctOutput

這是workign,但是當它潛水3 37它給我8而不是8.108。

我該如何修改這個給我一個準確的答案?我需要使用整數來表示數字嗎?如果是的話 - 進入什麼?

回答

2
**--Cast the denominator as Float** 
    SELECT 3 * 100/NULLIF(CAST(37 AS FLOAT),0) -- 8.10810810810811 

    **--Multiply by 1.0 in either numerator OR denominator** 
    SELECT 3 * 100/NULLIF(37 * 1.0,0) -- 8.108108 
    SELECT 3.0 * 100/NULLIF(37,0) -- 8.108108 


    **--Convert it to decimal** 
    SELECT CONVERT(DECIMAL(25,13), 3) * 100/
      NULLIF(CONVERT(DECIMAL(25,13), 37),0) -- 8.108108108 
+1

您不必同時轉換分子和分母。如果你只是需要避免整數除法,那麼只需轉換其中的一個即可。 –

+0

@AndriyM我同意。感謝您指出。我現在編輯了我的答案。 – vmvadivel

3

嘗試隱式轉換:

SELECT 
    numberOne, 
    numberTwo, 
    ((1.0*numberOne)*100/NULLIF(1.0*numberTwo, 0)) as PctOutput 
+0

豈不是更安全寫'SELECT numberOne,numberTwo,NULLIF(100.0 * numberOne /(1.0 * num berTwo),0)作爲PctOutput'來避免零分? – dgw

+0

@dgw:其實danihp的解決方案確實解決了零分區問題,而您的解決方案會導致錯誤。 –

+0

@AndriyM你是對的。我混淆了'NULLIF'和'IFNULL'。我的錯。 – dgw

2

在SQL Server中的結果是相同類型的輸入的始終。所以是的,你需要轉換輸入。

我通常使用convert(decimal(9,2),numberOne)進行轉換,但取決於您可能想要轉換(real,numberOne)或使用不同級別的精度。

2

您需要將INT中的數字轉換爲浮點數或小數點。

如果您使用的文字,它們將可能是十進制(數字),而不是浮動(http://stackoverflow.com/questions/1072806/sql-server-calculation-with-numeric-literals)

注如果你使用十進制,你應該知道的規模和精密的劃分規則,如果你有,你可能會失去精度邊界附近號碼:

http://msdn.microsoft.com/en-us/library/ms190476.aspx