计算器与SQL Server提供不同的结果

计算器与SQL Server提供不同的结果,sql,sql-server,Sql,Sql Server,我有一个简单的计算sumeom_计数/3。结果是值为82,而不是84 当我使用计算器时,我得到84: select sum(eom_mbr_count ) from elig table = 252 select sum(eom_mbr_count/3) from elig table = 82 计算机上的计算器252/3=84,我知道84是正确的,非常感谢您的帮助。谢谢你运气不好,因为你的总和是一个可以被3整除的数字,否则你自己可能已经发现了问题,至少你想知道为什么会这样 正如我的评论和您对

我有一个简单的计算sumeom_计数/3。结果是值为82,而不是84

当我使用计算器时,我得到84:

select sum(eom_mbr_count ) from elig table = 252
select sum(eom_mbr_count/3) from elig table = 82

计算机上的计算器252/3=84,我知道84是正确的,非常感谢您的帮助。谢谢

你运气不好,因为你的总和是一个可以被3整除的数字,否则你自己可能已经发现了问题,至少你想知道为什么会这样

正如我的评论和您对问题的回答所表明的,您的字段是一个整数字段,当您将一个整数除以另一个整数时,您得到的整数除法不会产生浮点数,它会产生另一个整数

举个例子,如果你除以1/3,大多数编程语言和数据库引擎在整数和浮点数之间有一个硬分隔,结果将是0,而不是0。333。。。。。如果一个整数除法将产生另一个整数,则它不能产生.333,它将始终产生一个整数,在本例中为0

因此,在您的案例中,您有1行或多行,当您的eom_mbr_count字段使用整数除法除以3时,将丢失小数部分,从而产生一个看起来错误的结果

作为一个例子,考虑在数据库中有9行,其中所有行的EOMYMBRYSCOUNT字段中的值为1。< /P> 如果对所有行的字段求和,则得到9。但是,如果对所有这些行的eom_mbr_count/3结果求和,则将得到0,因为每个单独的行结果将产生0

解决此问题的最简单方法是推迟除法,直到将所有行相加:

select sum(eom_mbr_count)/3 from elig table = 82
请注意,我将/3移出了括号,这意味着将把总和除以3,而不是每个元素的总和除以3


另一种解决方案可能是除以3.0,这将产生一个浮点除法,但我建议再次使用上述方法,以避免在每行传播浮点错误。

您运气不好,因为求和的结果是一个可以被3整除的数,否则你自己可能已经发现了问题,至少想知道为什么会这样

正如我的评论和您对问题的回答所表明的,您的字段是一个整数字段,当您将一个整数除以另一个整数时,您得到的整数除法不会产生浮点数,它会产生另一个整数

举个例子,如果你除以1/3,大多数编程语言和数据库引擎在整数和浮点数之间有一个硬分隔,结果将是0,而不是0。333。。。。。如果一个整数除法将产生另一个整数,则它不能产生.333,它将始终产生一个整数,在本例中为0

因此,在您的案例中,您有1行或多行,当您的eom_mbr_count字段使用整数除法除以3时,将丢失小数部分,从而产生一个看起来错误的结果

作为一个例子,考虑在数据库中有9行,其中所有行的EOMYMBRYSCOUNT字段中的值为1。< /P> 如果对所有行的字段求和,则得到9。但是,如果对所有这些行的eom_mbr_count/3结果求和,则将得到0,因为每个单独的行结果将产生0

解决此问题的最简单方法是推迟除法,直到将所有行相加:

select sum(eom_mbr_count)/3 from elig table = 82
请注意,我将/3移出了括号,这意味着将把总和除以3,而不是每个元素的总和除以3

另一种解决方案可能是除以3.0,这将产生一个浮点除法,但我建议再次使用上述方法,以避免为每行传播浮点错误。

SQL Server进行整数除法,因此1/2是0,而不是0.5。只需除以3.0,而不是3:

select sum(eom_mbr_count / 3.0) /
from elig
SQL Server进行整数除法,因此1/2是0,而不是0.5。只需除以3.0,而不是3:

select sum(eom_mbr_count / 3.0) /
from elig

我的灵能告诉我,场eom_mbr_count是一个整数场。这意味着eom_mbr_count/3将执行整数除法,这将截断。例如,10/3将产生3,而不是3。3333。。。。。。。。。。。。尝试从elig\U表中选择sumeom\U mbr\U计数/3。这将在最后进行整数除法。作为我上面所说的示例。如果该字段中有9行的值均为1,则整数除法的1/3将产生0,这意味着9次相加仍将产生0。然而,如果你首先对字段求和,得到9,然后除以3,你将得到3。您也可以尝试除以3.0,但很可能会传播所有行的浮点错误,最好在末尾进行除法。@LasseV.Karlsen您应该将此作为答案发布一旦我找到复选标记,我将关闭。。。再次谢谢你。一旦我找到那个解决了的复选标记,我会检查作为答案,我不会在这里出那么多精神病
hic powers告诉我,字段eom_mbr_count是一个整数字段。这意味着eom_mbr_count/3将执行整数除法,这将截断。例如,10/3将产生3,而不是3。3333。。。。。。。。。。。。尝试从elig\U表中选择sumeom\U mbr\U计数/3。这将在最后进行整数除法。作为我上面所说的示例。如果该字段中有9行的值均为1,则整数除法的1/3将产生0,这意味着9次相加仍将产生0。然而,如果你首先对字段求和,得到9,然后除以3,你将得到3。您也可以尝试除以3.0,但很可能会传播所有行的浮点错误,最好在末尾进行除法。@LasseV.Karlsen您应该将此作为答案发布一旦我找到复选标记,我将关闭。。。再次谢谢你。一旦我找到那个已解决的复选标记,我将检查作为答案,我不会在这里指出,总和中的许多划分确实会产生错误。在我的测试中,我得到了76399150184002.960409而不是76399150184010。更不用说它的速度要慢2-3倍。在int溢出的情况下,可以在sum内强制转换为bigint。在sum内除法确实会产生错误。在我的测试中,我得到了76399150184002.960409而不是76399150184010。更不用说它的速度要慢2-3倍。在int溢出的情况下,可以在sum内强制转换为bigint。