将商或更长的表达式分配给局部(实际)变量T SQL

时间:2019-03-13 20:48:53

标签: sql sql-server tsql

要学习这些,肯定是我犯错了...

如果我DECLARE是一个实数(或十进制)局部变量,我不能分配(SET)一个表达式的值吗?我必须先设置一个值,然后逐步执行表达式。如果我一次尝试全部“做数学”,就会得到0

所以,这可行。

DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
--SET @HitRate = (805499 / 847125) * 100  --But this does not work?
SELECT @HitRate
  • 如果我注释掉前2条SET语句,而仅使用第3条,我得到0
  • 如果我全部使用3,我将得到0
  • 如果我CAST(@HitRate As DECIMAL(9,2))我得到0

3 个答案:

答案 0 :(得分:1)

demo,您需要将805499设置为805499.00,这意味着int要浮动

DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
SET @HitRate = (805499.00 / 847125) * 100.00  --this will  work now
SELECT @HitRate

您得到0是因为805499/847125 = 0.95,但是db引擎返回0是因为它是一个整数值,这就是为什么当您将100与0相乘时也会输出0

或者您可以像下面这样明确cast

SET @HitRate = (cast( 805499 as float) / 847125) * 100 

它还将返回95.0862

答案 1 :(得分:1)

如果使用以下语句

SET @HitRate = (805499 / 847125) * 100

因为0805499是整数,所以它将返回847125,因此除法的结果是integer = 0

基于TSQL division official documentation

  

返回优先级较高的参数的数据类型。

     

如果将整数除数除以整数除数,则结果是整数,其结果的任何小数部分都会被截断。

您可以从下面的链接检查SQL数据类型优先级列表:

但是当您使用时:

DECLARE @HitRate real
SET @HitRate = 805499
SET @HitRate = (@HitRate / 847125) * 100
SELECT @HitRate 

它将返回95.0862 ,因为@HitRate的类型为real,并且优先级高于整数

答案 2 :(得分:0)

这对我有用:尝试在设置值中添加.00。

DECLARE @HitRate real
SET @HitRate = 805499.00
SET @HitRate = (@HitRate / 847125.00) * 100.00
--SET @HitRate = (805499 / 847125) * 100  --But this does not work?
SELECT @HitRate

enter image description here