mssql显示1个小数点(如果可用),否则显示无

时间:2013-07-10 10:31:30

标签: sql-server decimal-point

我认为很简单。

我有一个显示项目长度的查询。

查询:

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.0,我希望它显示为3

因此,如果没有小数值,则显示int没有小数。如果存在十进制显示十进制到1小数点?

所以期望的输出是36而不是3.06.0

我正在使用MSSQL 2012。

4 个答案:

答案 0 :(得分:5)

另一种变体(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 

答案 1 :(得分: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

答案 2 :(得分:1)

我认为这样可行:

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

我假设长度的数据类型为数字(?,1)。

答案 3 :(得分:1)

为什么不

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

它能解决你的问题吗?