我正在尝试获取数据历史记录中值的平均递归率。为了完成此操作,我正在运行查询:
SELECT ROUND(COUNT(*)/COUNT(DISTINCT ChairID),10)
FROM Chair
WHERE xyz= 1
查询返回 1,但应返回 1.0500000000。
运行
SELECT COUNT(*)
FROM Chair
WHERE xyz = 1
返回 21
和跑步
SELECT COUNT(DISTINCT ChairID)
FROM Chair
WHERE xyz=1
返回 20。
因此,第一个查询应返回 1.05。
我认为问题在于服务器返回数据的格式。我正在使用带有本地数据库的Visual Studio。有什么建议可以解决这个问题吗?
这是因为COUNT()
返回一个整数值。使其非整数的一个技巧是乘以 1.0
.
SELECT ROUND( COUNT(*) / (COUNT(DISTINCT ChairID) * 1.0), 10)
FROM Chair
WHERE xyz = 1
您正在执行整数除法,这就是为什么获得整数作为结果的原因。将其中一个值转换为十进制以获得十进制结果。
SELECT CAST( COUNT(*) AS DECIMAL(20)) / COUNT(DISTINCT ChairID)
FROM Chair
WHERE xyz= 1
还可以使用 CAST 进行转换。
COUNT()
始终返回一个整数值,因为它表示行数。在 SQL Server 中使用整数进行数学运算时,结果始终是一个整数(总和、休息、乘法和除法(。在执行除法后转换值不会产生差异。应将除法的任何部分转换为使用小数的数据类型,如 DECIMAL
或 FLOAT
。
您可以写CONVERT(DECIMAL(8,2), COUNT(*)) / COUNT(DISTINCT ChairID)
或者,作为一种技巧,您可以将任一值乘以 1.0
(这是双精度(,结果将被视为双COUNT(*) * 1.0 / COUNT(DISTINCT ChairID)
。