SQL除法运算两个整数得到小数值错误

5
在SQL语句中,我试图将两个整数相除(下面的代码中整数1为“abc”,整数2为“xyz”),并获得一个十进制结果(下面的代码中为“def”)。十进制结果应该只有一个前导的1或0,后跟一个小数点和小数点后的3个数字。但是我的代码始终返回一个没有小数位的零。
SELECT CONVERT(DECIMAL(4,3), abc/xyz) AS def

这段代码的结果是“0”,但我想要的是类似于“0.001”或“0.963”的结果。我认为它仍然将“def”视为整数,而不是小数。
我也尝试过在abc和xyz上使用CAST,但返回的仍然是相同的结果。我还尝试了以下代码:
SELECT CONVERT(DECIMAL(4,3), abc/xyz) AS CONVERT(DECIMAL(4,3)def)

但是这给我一个错误,说在单词“CONVERT”附近有语法错误。
4个回答

6
在除法之前将其转换为十进制,而不是之后。将答案格式化为转换结果。
SELECT 
  CONVERT( DECIMAL(4,3)
         , ( CONVERT(DECIMAL(10,3), abc) / CONVERT(DECIMAL(10,3), xyz) ) 
         ) AS def

然后我收到了以下错误提示 - 算术溢出错误,将int转换为数值数据类型。 - user2762748
那就意味着你的初始值大于DECIMAL(4,3)。我应该先问一下,而不是直接从你的初始结果中获取,抱歉。如果初始字段是整数,则可以达到20亿,因此将其转换为DECIMAL(13,3)。但基本上将转换为DECIMAL(x,3),其中x足够大以容纳您的初始整数值。将编辑答案以适合SQL INT数据类型的大小。 - asantaballa
谢谢。如果我增加它,那么我确实会得到值,但它仍然没有按照我想要的格式进行格式化。如果我使用Decimal(10,3),那么我的一些值如下:0.36、0.3470588235、0、0.1、0.292134831。我希望结果总是有一个小数点,并且小数点右边恰好有3个数字。我是否也必须对“def”执行CONVERT操作? - user2762748
很棒,我们有数据了。最初的转换是为了获得正确的数据。所以,如果你想控制输出的格式,那么也可以使用“format”进行转换。我已经编辑了答案,使用了你最初提供的DECIMAL(4,3),但如果不够大,可以根据需要进行调整。 - asantaballa
我们已经接近成功了。现在,最多只显示3位小数,这很好。但是如果最后一位小数是0,则会被省略。因此,有些结果返回为“0.3”,而我需要“0.300”。另外,我有一个结果是“1”,我需要“1.000”。我需要更改“Convert(Decimal(4,3)”区域的内容吗? - user2762748
没事了,我想我已经弄清楚那部分了。在页面上呈现数据的地方,我用FormatNumber(def,3)包装了“def”,现在它显示出我想要的样子了。谢谢你的帮助! - user2762748

2
这应该可以解决问题。还需添加除零检查。
 SELECT CONVERT(DECIMAL(4,3), abc) / NULLIF(xyz,0)

0

尝试类似这样的东西

SELECT CONVERT(DECIMAL(4,3), abc/(xyz * 1.0)) AS def

0

希望这个能够正常工作...

SELECT CONVERT(DECIMAL(4,3), abc/10.0) AS def
  FROM dbo.whatever;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接