2016-08-22 93 views
0

我想將我的小數SQL查詢結果以百分比轉換。示例我有一個0.295333我希望它是30%,如果我有一個0.090036我希望它是9%。使用SQL查詢刪除小數點

這是我到目前爲止。

(100 * (sample1/ sample2)) as 'Percent' 

我也試過這一個,但問題是結果帶有」 .00",我不知道如何刪除小數。

cast (ROUND(100 * (sample1/sample2),0) As int) as 'Percent' 
+1

實際上,您並不需要括號作爲sample1/sample2。它應該是'100.0 * sample1/sample2' – ZLK

+0

我會使用'100.0 * sample1/sample2'來避免意外的隱式轉換爲'int'並截斷數據 – cha

+1

@cha如果兩個變量都是'INT' –

回答

1

與下面的腳本嘗試..

cast (100 * Round((sample1/sample2),2) As int) as 'Percent' 
1

所以當一些評論人士指出,可能需要注意你的數據類型,如果一個或兩個,你從你得到小數原列是整數。

一個處理這一簡便的方法是這樣的:

ColA * ColB * 1.0這將確保您的整數被視爲小數

因此,如果您具有SQL Server 2012+可以使用格式,而不是亂七八糟的。像這樣FORMAT(YourDecimal,'#%'),是的,那很簡單。

;WITH cteValues AS (
    SELECT 0.295333 as OriginalValue 
    UNION ALL 
    SELECT 0.090036 as OriginalValue 
) 

SELECT 
    OriginalValue 
    ,FORMAT(OriginalValue,'#%') as PercentFormat 
FROm 
    cteValues 

如果你是前2012年沒有格式的一種簡單的方法是通過100舍入到第100個兩三次,並投以int CAST(ROUND(YourDecimal,2) * 100 AS INT)

;WITH cteValues AS (
    SELECT 0.295333 as OriginalValue 
    UNION ALL 
    SELECT 0.090036 as OriginalValue 
) 

SELECT 
    OriginalValue 
    ,CAST(ROUND(OriginalValue,2) * 100 AS INT) as PercentInt 
FROm 
    cteValues 

由於int不能被定義有小數地方,如果您收到.00與類似的方法或您嘗試過的方法,我會問以下。

  • 您是否將鑄造後的值與其他列或值(可能是小數,數字或浮點數)相結合(相乘等)?
  • 您是否正在查看可能會自動格式化結果的SSMS之外的程序中的查詢結果,例如: Excel,Access?
1
  • 首先解決你的假設。

ROUND如何工作?它是否保證返回值,如果是,如何?兩欄的優先順序是什麼? Arithmetic operators影響結果和如何?

我只知道我不知道的,任何懷疑都值得調查。

  • 股利操作員

由於ROUND總是返回更高的優先級,這是沒問題的。它實際上是可以將您的值轉換爲整數的除法運算符(/)。

始終驗證變量是一致一個數據類型或CAST的如果任一不確定或不能保證(如不充分地進行格式化。即DECIMAL(4,2)代替所需DECIMAL(5,3))。

DECLARE @Sample1 INT 
       , @Sample2 DECIMAL(4,2); 
SET @Sample1 = 50; 
SET @Sample2 =83.11; 

SELECT ROUND(100 * @Sample1/@Sample2 , 0) 

返回正確60.

SELECT ROUND(100 * @Sample2/@Sample1 , 0) 

四捨五入之前錯誤地變成變量爲整數。

  • 的原因是,在DIVIDE - MSDN SQL可能會返回更高的優先級,但任何股息是一個整數返回另一個整數。

UPDATE 這也解釋了爲什麼小數保持輪後......那是更高的優先級。您可以添加另一個強制轉換將非INT數據類型轉換爲首選格式。

SELECT CAST(ROUND(<expression>, <Length>) AS INT) 

請注意,在回答你的問題時,我自己學到了一些東西! :)

希望這會有所幫助。