2013-07-10 119 views
1

簡單的我認爲。如果可用,mssql顯示1個小數點,否則顯示無

我有一個顯示項目長度的查詢。

查詢:

select length from vw_OutstandingVsInStock1 OVI 
LEFT JOIN Departments DEP 
on OVI.Department COLLATE DATABASE_DEFAULT=DEP.Description 
where OutstandingVolume>0.39 

這將返回類似的結果:

0.9 
1.2 
1.5 
1.8 
2.1 
2.4 
2.7 
3.0 
3.3 
3.6... 

在我想讓它顯示爲3

因此如果沒有十進制數值,表明int3.0的情況下,沒有小數。如果一個小數存在顯示小數點後一位小數點?

因此所需的輸出是36代替3.06.0

我使用MSSQL 2012

+1

服務器不顯示任何內容 - 它只是返回二進制8字節的'double'aka'long float'值。這是另一個將這個號碼顯示在屏幕上或紙上的程序。和什麼程序是你沒有告訴... –

+0

嗨,我正在使用管理工作室2012年的MSSQL查詢窗口?長度來源於視野。謝謝。 – Smudger

+0

四捨五入麼?你只想得到一個十進制數字而忽略其餘的數字,或者如果需要的話,你是否想要小數點向上或向下舍入?或者可以不會有一個以上的十進制數字? – jpw

回答

4

另一個變種(Fiddle

;WITH vw_OutstandingVsInStock1 (length) 
    AS (SELECT 0.9 UNION ALL 
     SELECT 1.2 UNION ALL 
     SELECT 1.5 UNION ALL 
     SELECT 1.8 UNION ALL 
     SELECT 2.1 UNION ALL 
     SELECT 2.4 UNION ALL 
     SELECT 2.7 UNION ALL 
     SELECT 3.0 UNION ALL 
     SELECT 3.3 UNION ALL 
     SELECT 3.6) 
SELECT IIF(length % 1 = 0, 
      CAST(length AS INT), 
      CAST(length AS SQL_VARIANT)) 
FROM vw_OutstandingVsInStock1 
+0

不錯!不工作在SS2008雖然:(。 –

+0

@sajjan只是用一個case表達式替換iif,其餘的工作原理是一樣的。 –

1

想不出什麼比這更清潔的時刻。我已經放置在CTE字面值,你會不會有把你現有的查詢:

;With rowss(length) as (
select 0.9 union all select 1.2 union all select 1.5 union all select 
     1.8 union all select 2.1 union all select 2.4 union all select 
     2.7 union all select 3.0 union all select 3.3 union all select 
     3.6 
) 
select 
    STUFF(stLength,CHARINDEX('.',stLength), 
     CASE WHEN stLength like '%.0' THEN 2 ELSE 0 END,'') 
from 
    (select CONVERT(varchar(10),length) as stLength from rowss) t 

的技巧是使用STUFF,並決定,基於字符串的結尾,要麼刪除2個字符或做沒有。

結果:

0.9 
1.2 
1.5 
1.8 
2.1 
2.4 
2.7 
3 
3.3 
3.6 
1

,我認爲這會工作:

SELECT 
    CASE WHEN RIGHT(length,1) = 0 THEN STUFF(length, LEN(length)-1, 2, '') 
    ELSE STUFF(length, LEN(length), 0, '') 
    END 

我假定長度有數據類型的數字(1 )。

1

爲什麼不

select cast(length as float) from vw_OutstandingVsInStock1 OVI 
... 

它是否解決問題了嗎?

相關問題