2014-09-11 192 views
0

我在表有一列数量,其类型是十进制(16,6)SQL值四舍五入

我想使从该表中的SELECT查询将

  • 显示数量为整数如果它没有小数位样1 5 1000
  • 想1.25 5.25 1000.25

我试图与在其它情况下2位小数显示数量:

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,如果该事项

+0

可能相关:http://stackoverflow.com/q/25569569/2186023 – DrCopyPaste 2014-09-11 12:50:29

+0

你可以做到这一点,但你必须转换为'VARCHAR'(或nvarchar)并手动格式化数字以满足您的需要,所有分支的案例必须返回相同的类型(即使是不会被击中的分支) – DrCopyPaste 2014-09-11 12:51:40

回答

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

补充一点,你是正确的格式不存在于SQL Server 2005中,所以你需要一个技巧。强制转换为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

+0

您可能是对的,但我的SQL Server 2005不支持FORMAT等函数。我想这肯定是最近的事情。 – RRM 2014-09-11 12:28:56

+0

是的,对不起,我以某种方式想到了MySQL。 SQL Server的语法有点不同。我编辑了我的答案。 – 2014-09-11 12:45:31

+0

对于SQL Server 2005来说更是不同。 – 2014-09-11 12:53:24

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中进行格式化。