SQL:division即使在尝试强制转换后也不会返回准确的结果

SQL:division即使在尝试强制转换后也不会返回准确的结果,sql,division,Sql,Division,提前感谢您的帮助。基本上,我没有得到十进制结果: 这是我的密码: select practitioner_id, count([Number of Acorns Used]) as [Surveys Used], count(patid) as [Number of Clients], cast(count(cast ([Number of Acorns Used] as float))/ count(cast (patid as float)) as decimal(10,2)) as

提前感谢您的帮助。基本上,我没有得到十进制结果: 这是我的密码:

select 
practitioner_id, 
count([Number of Acorns Used]) as [Surveys Used], 
count(patid) as [Number of Clients], 
cast(count(cast ([Number of Acorns Used] as float))/
count(cast (patid as float)) as decimal(10,2)) as [Survey Use Rate]
from #Results
group by practitioner_id
order by count([Number of Acorns Used]) desc
以下是部分结果(已删除从业者id):


!![数据结果][1]:

浮点不是精确的数字数据类型。因此,它有时会给你轻微的结果。改用
十进制(7,2)
。或者你需要的任何东西来满足你的需求。
浮点不是一种精确的数字数据类型。因此,它有时会给你轻微的结果。改用
十进制(7,2)
。或者你需要的任何东西来满足你的需求。

无法获得十进制结果的原因是count()的输出是int,因此您希望将强制转换移到count()函数之外

select 
practitioner_id, 
count([Number of Acorns Used]) as [Surveys Used], 
count(patid) as [Number of Clients], 
 cast(count([Number of Acorns Used]) as decimal(10,2))/
 cast(count(patid) as decimal(10,2))
  as [Survey Use Rate]
from #Results
group by practitioner_id
order by count([Number of Acorns Used]) desc

无法获得十进制结果的原因是count()的输出是int,因此您希望将强制转换移到count()函数之外

select 
practitioner_id, 
count([Number of Acorns Used]) as [Surveys Used], 
count(patid) as [Number of Clients], 
 cast(count([Number of Acorns Used]) as decimal(10,2))/
 cast(count(patid) as decimal(10,2))
  as [Survey Use Rate]
from #Results
group by practitioner_id
order by count([Number of Acorns Used]) desc

你把演员安排错地方了。例如,此操作的结果是一个整数:

计数(铸造([使用的橡子数量]作为浮点数))

将其更改为
cast(计数([使用的橡子数])作为十进制(19,6)

您可以通过自己选择列来确定这一点

我还建议使用十进制而不是浮点(这是不精确的,实际应用非常有限)

因此,请尝试以下完整表达式:

cast(count([Number of Acorns Used]) as DECIMAL(19,6))
/
cast(count(patid) as decimal(10,2)) as [Survey Use Rate]

问题是……除非您使用了
DISTINCT
,否则我不希望这些计数返回不同的数字。但我不知道这是什么类型的SQL。

您的强制转换位置错误。例如,这是一个整数:

计数(铸造([使用的橡子数量]作为浮点数))

将其更改为
cast(计数([使用的橡子数])作为十进制(19,6)

您可以通过自己选择列来确定这一点

我还建议使用十进制而不是浮点(这是不精确的,实际应用非常有限)

因此,请尝试以下完整表达式:

cast(count([Number of Acorns Used]) as DECIMAL(19,6))
/
cast(count(patid) as decimal(10,2)) as [Survey Use Rate]

问题是……除非您使用
DISTINCT
,否则我不希望这些计数返回不同的数字。但我不知道这是什么类型的SQL。

基本问题是您的数据库(可能是SQL Server)进行整数除法。因此,当您将两个整数除法时,结果是一个整数。然后您可以将其强制转换为任意值,但过程是:3/2-->1-->1.00

我通常只是将一个值乘以1.0进行除法:

select practitioner_id, 
       count([Number of Acorns Used]) as [Surveys Used], 
       count(patid) as [Number of Clients], 
       (count([Number of Acorns Used]) * 1.0 /
        count(patid)
       ) as [Survey Use Rate]
from #Results r
group by practitioner_id
order by [Surveys Used] desc;

正如其他人所指出的,计算浮点数与计算整数、计算字符串或计算日期是一样的。
count()
始终返回整数。

基本问题是您的数据库(可能是SQL Server)进行整数除法。因此,当您将两个整数除法时,结果是一个整数。然后您可以将其强制转换为任意值,但过程是:3/2-->1-->1.00

我通常只是将一个值乘以1.0进行除法:

select practitioner_id, 
       count([Number of Acorns Used]) as [Surveys Used], 
       count(patid) as [Number of Clients], 
       (count([Number of Acorns Used]) * 1.0 /
        count(patid)
       ) as [Survey Use Rate]
from #Results r
group by practitioner_id
order by [Surveys Used] desc;


正如其他人所指出的,计算浮点数与计算整数、计算字符串或计算日期是一样的始终返回一个整数。

您尝试过使用数据类型float吗?当您添加SQL标记时,出现了一个相当大的红色框,建议您也为正在使用的特定DBMS添加一个标记,因为它们之间的功能和语法不同。您选择忽略该建议有什么原因吗?这是有原因的-它不仅仅是您可以更快地回答问题,但这样可以避免浪费为一个DBMS编写答案的人的时间,因为他们发现它不适合您,因为您正在使用其他东西。此外,如果可以,请将一些示例数据转储到SQLFiddle或其他东西中,并向我们显示您期望的结果。您确定要计算()吗[Number of acorns used]列?属性的名称表明它已经是一个计数,我想知道您是否要求和()使用的acorns数量。感谢Ken对特定DBMS的建议。这是SQL Server 2012。您尝试过使用数据类型float吗?当您添加SQL标记时,出现一个相当大的红色框,建议您也为您正在使用的特定DBMS添加标记,因为它们之间的功能和语法不同。您选择忽略它有什么原因吗hat建议?它的存在是有原因的——它不仅可以让你更快地得到答案,而且可以避免浪费那些为一个DBMS编写答案的人的时间,因为他们发现它不适合你,因为你正在使用其他东西。此外,如果可以的话,将一些示例数据转储到SQLFiddle或其他东西中,并向我们展示你期望的结果。Are您确定要对[Number of acorns used]列进行计数()吗?该属性的名称表明它已经进行了计数,我想知道您是否要求和()使用的acorns数量。感谢Ken对特定DBMS的建议。这是SQL Server 2012。引用SQL Server文档只有在海报表明他们正在使用SQL Server时才相关。真的。我在这一点上跳了枪。不过,该链接确实提供了一些关于适用于多个主要数据库的数字数据类型的通用信息语言。除ms sql server外,是否有任何RDBMS在属性名称周围使用[]?ms Access:)顺便说一句,浮点二进制可以给出小数的舍入误差,这是因为它是什么,而不是因为DBMS。是否有任何系统中名为float的类型表示浮点小数而不是浮点二进制?引用SQL Server文档仅在海报上指出的情况下才相关他们使用的是SQL Server.True。我在这一点上跳了枪。但是,该链接确实提供了一些关于将应用于几种主要语言的数字数据类型的相当一般的信息。是否有任何RDBMS在属性名称周围使用[]而不是ms SQL Server?ms Access:)顺便说一下,二进制浮点可以给出小数的舍入误差