在 SQL 中舍入平均值时如何检索小数
Posted
技术标签:
【中文标题】在 SQL 中舍入平均值时如何检索小数【英文标题】:How do I retrieve decimals when rounding an average in SQL 【发布时间】:2012-11-05 17:44:19 【问题描述】:这是我的 SQL 语句
SELECT ROUND(AVG(column_name), 100)
FROM [database].[dbo].[table]
我检索到的答案是 3
,其中可能的数字范围介于 1 - 5
之间,共有 908 行。
我需要它说3.0
或3.09
。这可能吗?
【问题讨论】:
为ROUND
的长度参数指定100
有什么意义?
因为你需要 3 个参数才能让 round 函数工作,所以我也将它四舍五入到最接近的 100
但我的意思是,你永远不会得到 100 位小数的精度,所以ROUND(,100)
不会影响任何事情。只需执行AVG(column_name)
并完成它。
将100
与 ROUND 函数一起使用并不意味着舍入到最接近的第 100 位。这意味着您想要小数点后的 100 位数字。请参阅MSDN: ROUND (Transact-SQL) 处的示例
我很抱歉,我试图得到下面发布的 Guffa 提供的答案。我能够达到发布问题时达到的目的,如果没有他的帮助,我不相信我能找到解决方案。我不明白为什么作为一个没有做过研究的人,这被否决了。
【参考方案1】:
平均值将与值具有相同的数据类型,因此请转换值:
SELECT ROUND(AVG(CAST(column_name AS FLOAT)), 2) FROM [database].[dbo].[table]
【讨论】:
谢谢,这个答案有效!我会尽快将其标记为已回答 我不确定为什么我得到了我的结果。仅使用我得到 3 的平均值,使用您提供的浮点数我得到 3.57 这是为什么...为什么它没有平均或四舍五入? @Skullomania ??,因为你说你想对你的问题进行十进制数字,为什么现在要四舍五入? 我不想把它四舍五入。我只是好奇为什么原来的数字是3而不是4。似乎我没有完全理解float在SQL中的用途。我现在知道了。谢谢! @Skullomania:因为转换为整数实际上是截断而不是四舍五入。【参考方案2】:我不确定这是否会帮助你,但试试这个
SELECT CAST(AVG(CAST(column_name as DECIMAL(10,2))) AS DECIMAL(10,2))FROM [table_name]
浮点数是近似值,另一方面,小数会使其更精确,您可能需要阅读浮点数数学和小数。起初我为此感到挣扎,但有时仍然感到迷茫。希望这会对您有所帮助。
在 C# 中
不知道我在这里发布答案是否会遇到麻烦,但您是否尝试过将其转换为双精度并使用ExecuteScalar()
试试这个:
protected void Page_Load(object sender, EventArgs e)
SqlConnection conn= sqlconnectionstring;
SqlCommand cmd = new SQLCommand("SELECT STATEMENT",conn);
cmd.CommandType = CommandType.Text;
conn.Open();
Double result = Convert.ToDouble(cmd.ExecuteScalar());
lblresult.text = "the result is " + result;
conn.Dispose();
cmd.Dispose();
【讨论】:
感谢俄巴底亚。这看起来很棒!请解释为什么您使用了两次投射。 如果您只投射一次,那么您的结果将超过 3 位小数...我认为这正是您想要的。您不想四舍五入到最接近的第 100 位吗? 没错。谢谢俄巴底亚!现在我只需要弄清楚如何在 c# 的变量中得到这个结果 只是想知道,而不是CAST(AVG(CAST))
,你为什么不能只做CAST(AVG(col_name) AS DECIMAL(10,2))
?【参考方案3】:
你甚至不需要在那里写ROUND
,真的。您可以将您的值转换为DECIMAL
,如下所示:
SELECT AVG(CONVERT(DECIMAL(16,2),YourColumn))
FROM YourTable
【讨论】:
@Guffa - 是的,这是真的。虽然 op 没有指定他的列的数据类型。而且,为了记录,转换为FLOAT
也会带来近似值而不是精确值。
你能解释一下(16,2)部分的原因吗【参考方案4】:
我不完全确定您要问什么,但我认为您希望返回的数字更加精确。
您将调用包装在 ROUND 函数中,但如果您的列的数据类型没有任何大于 0 的精度(例如 int),您需要先将数据 CAST 或 CONVERT 转换为另一种类型。
以下是一些示例,说明了将CAST 数据转换为不同类型的几种方法:
SELECT CAST(100 AS decimal(5, 2)) -- Gives you "100.00"
,CAST(100 AS float) --<== Gives you "100"
,CAST(100.0 AS float) --<== Gives you "100"
,CAST(100.01 AS float) --<== Gives you "100.01"
另外,请查看MSDN: Data Types (Transact-SQL)。
【讨论】:
您转换为FLOAT
的示例不一定正确,但它们可能因每次执行而异。因此,例如,CAST(100 AS FLOAT)
可能会返回 99.999999
或 100.000001
虽然在计算中使用浮点数并不总是准确的,但我从未见过在 SQL Server 中转换为浮点数的数字在一次执行到下一次执行时返回不同的结果。当在多次迭代或计算中复合不准确性时,浮点数的不准确性变得更加普遍。【参考方案5】:
CAST(AVG(column_name) AS DECIMAL(5, 2))
将 100 显示为 100.00 和 100.05 为 100.05
【讨论】:
以上是关于在 SQL 中舍入平均值时如何检索小数的主要内容,如果未能解决你的问题,请参考以下文章