Tsql 浮点数的错误结果

Tsql 浮点数的错误结果,tsql,sql-server-2012,Tsql,Sql Server 2012,我有这张有1张唱片的桌子。我试图计算一个叫做Puntaje的东西,为了得到Puntaje的结果,我必须遵循以下公式: Puntaje = (Infracciones * 10) / Horas Horas = Segundos / 60 / 60 我写了下面的脚本,但我有一些疑问和问题。 1) 是否有其他方法将值分配给@variables或计算总和? 2) 为什么Puntaje结果为0.00,必须为:0.854 Im使用MS SQL Server 2012 有人能帮我解决这个问题吗?先

我有这张有1张唱片的桌子。我试图计算一个叫做Puntaje的东西,为了得到Puntaje的结果,我必须遵循以下公式:

Puntaje = (Infracciones * 10) / Horas
Horas = Segundos / 60 / 60    
我写了下面的脚本,但我有一些疑问和问题。 1) 是否有其他方法将值分配给@variables或计算总和? 2) 为什么Puntaje结果为0.00,必须为:0.854

Im使用MS SQL Server 2012

有人能帮我解决这个问题吗?先谢谢你

/* content of table: @Customer_Drivers

DriverId    Segundos  KM    QtyExcesos  QtyFreAce   QtyDesc Puntaje IDC
6172        717243    1782  17          0           0       0       0
*/

DECLARE @Customer_Drivers TABLE (
    DriverId INT,
    Segundos INT,
    KM INT,
    QtyExcesos INT,
    QtyFreAce INT,
    QtyDesc INT,
    Puntaje INT,
    IDC INT
);
SET NOCOUNT ON;
INSERT INTO @Customer_Drivers (DriverId, Segundos, KM, QtyExcesos, QtyFreAce, QtyDesc, Puntaje, IDC)
VALUES (6172, 717243, 1782, 17, 0, 0, 0, 0);
SET NOCOUNT OFF;

DECLARE @DriverId INT = 6172;
DECLARE @Horas INT;
DECLARE @QtyExcesos INT ;
DECLARE @QtyFreAce INT ;
DECLARE @QtyDesc INT ;
DECLARE @Infracciones INT;
DECLARE @Puntaje Decimal(18,2);

SET @Horas = (SELECT Segundos FROM @Customer_Drivers WHERE DriverId = @DriverId) / 60 / 60;
SET @QtyExcesos = (SELECT QtyExcesos FROM @Customer_Drivers WHERE DriverId = @DriverId);
SET @QtyFreAce = (SELECT QtyFreAce FROM @Customer_Drivers WHERE DriverId = @DriverId);
SET @QtyDesc = (SELECT QtyDesc FROM @Customer_Drivers WHERE DriverId = @DriverId);
SET @Infracciones = (@QtyExcesos + @QtyFreAce + @QtyDesc);
SET @Puntaje = ( @Infracciones * 10) /@Horas;

PRINT @Horas
PRINT @QtyExcesos
PRINT @QtyFreAce
PRINT @QtyDesc
PRINT @Puntaje

/* OUTPUT
    199     -- @Horas
    17      -- @QtyExcesos
    0       -- @FreAce
    0       -- @QtyDesc
    0.00    -- @Puntaje must be = 0.854
*/

从我所学到的@变量应该是一些参数光输入参数和输出参数。。。。尝试执行您的存储过程,看看您在SQLServerManagementStudio中得到了什么


应该有一个返回值。

根据我所学的内容@变量应该是一些参数光输入参数和输出参数。。。。尝试执行您的存储过程,看看您在SQLServerManagementStudio中得到了什么


应该有一个返回值。

即使
@Puntaje
声明为
十进制(18,2)
,但这并不意味着您的计算将被视为十进制。问题是
(@Infracciones*10)/@Horas
正在使用所有整数,因此此表达式将生成整数值
0
。然后将该整数
0
转换为十进制并存储在
@Puntaje

要解决此问题,需要先将表达式的一部分转换为十进制,以便结果为十进制:

SET @Puntaje = ( CAST(@Infracciones AS Decimal(18,2)) * 10) / @Horas

尽管
@Puntaje
声明为
十进制(18,2)
,但这并不意味着您的计算将被视为十进制。问题是
(@Infracciones*10)/@Horas
正在使用所有整数,因此此表达式将生成整数值
0
。然后将该整数
0
转换为十进制并存储在
@Puntaje

要解决此问题,需要先将表达式的一部分转换为十进制,以便结果为十进制:

SET @Puntaje = ( CAST(@Infracciones AS Decimal(18,2)) * 10) / @Horas

您在计算中使用整数,因此结果将四舍五入(或截断)为最接近的整数。使用十进制值,或使用“强制转换”:

@Puntaje = (cast(@Infracciones as decimal(18,2)) * 10.0) / cast(@Horas as decimal(18,2))

检查我的语法-只需在不尝试的情况下键入此选项

您在计算中使用的是整数,因此结果将四舍五入(或截断)为最接近的整数。使用十进制值,或使用“强制转换”:

@Puntaje = (cast(@Infracciones as decimal(18,2)) * 10.0) / cast(@Horas as decimal(18,2))
检查我的语法-只需在没有尝试的情况下键入它即可

1)您可以使用
选择@Horas=Segundos/3600、@qtyexceos=qtyexceos。。。来自[RS_Reports].[dbo].[Customer_Drivers],其中DriverId=@DriverId
。只要有一行结果,这应该是可行的

2) 其他人已经回答了,您必须除以小数才能得到小数,也就是说,您必须将@Horas转换为小数

1)您可以使用
选择@Horas=segudos/3600,@qtyexceos=qtyexceos。。。来自[RS_Reports].[dbo].[Customer_Drivers],其中DriverId=@DriverId
。只要有一行结果,这应该是可行的


2) 其他人已经回答了,你必须除以小数才能得到小数,也就是说,你必须将@Horas转换为小数

非常感谢你,Ray,这对我帮助很大。非常感谢你,Ray,这对我帮助很大。非常感谢你,Tomas,这也对我帮助很大。我不知道怎样才能使两者都合格。非常感谢你,托马斯,这对我也有很大帮助。我不知道如何使两者都合格。谢谢你的回答,康纳。谢谢你的回答,康纳。谢谢你的回答,大卫。谢谢你的回答,大卫。