SQL值四舍五入

时间:2014-09-11 10:13:33

标签: sql sql-server tsql rounding

我在表格中有一列数量,其类型为十进制(16,6)

我想从该表中创建一个

的SELECT查询
  • 如果没有像1 5 1000
  • 这样的小数位,则显示数量为整数 在其他情况下,
  • 会显示2位小数,例如1.25 5.25 1000.25

我试过了:

SELECT 
CASE WHEN (Quantity-CAST(Quantity AS int )=0) THEN CAST(Quantity AS int)
ELSE CAST(Quantity AS decimal(16,2)) END
FROM Table

但它返回的值如1.00

有可能吗?我现在想知道我是否真的试图将两种数据类型放入单列中?它以某种方式工作,但可能不是我希望的。

如果重要,我正在使用Microsoft SQL Server

2 个答案:

答案 0 :(得分:1)

您正在将数字与其外部代表混合在一起。数字1.23可以显示为1.23或1.230或1.2300000。此处的数字始终相同,但您显示的字符串不同。

所以你需要做的是从你的号码创建一个所需格式的字符串。执行此操作的功能是FORMAT(数字,数字)。

select 
  case
    when quantity = round(quantity,0,1) then format(quantity,'0')
    else format(quantity,'0.00')
  end
from mytable;

SQL小提琴:http://sqlfiddle.com/#!6/cdc85/1

Darn it,你是对的SQL Server 2005中不存在FORMAT,所以你需要一个技巧。根据您是想要两位还是零位转换为int或货币,然后在任何情况下转换为varchar,因此两个表达式都会产生相同的数据类型。

select 
  case
    when quantity = round(quantity,0,1) then convert(varchar, cast(quantity as int), 1)
    else convert(varchar, cast(quantity as money), 1)
  end
from mytable;

小提琴:http://sqlfiddle.com/#!6/cdc85/4

答案 1 :(得分:0)

检查以下示例

declare @val as decimal(16,6)

set @val = 10.23

select convert(float,ROUND(@val,2))
--OUTPUT: 10.23

set @val = 10

select convert(float,ROUND(@val,2))
--OUTPUT: 10

set @val = 10.12345

select convert(float,ROUND(@val,2))
--OUTPUT: 10.12

此处的问题是,如果有10.10000之类的值,则会显示为10.1

您可以做的另一件事就是建议您将其保留为SQL,并根据需要在View中对其进行格式化。