SQL 从 3 位小数舍入到 2 位小数

标签 sql ssrs-2008 rounding

我有一个 SSRS 2008 报告,其数据集运行一个返回计算列的 SQL 查询。此数据集填充报告中的表格。

计算列最多返回 4 位小数。我想四舍五入到最接近的两位小数。即 8660.125 应该变成 8660.13,1487.8521 应该变成 1487.85

查询示例:

select [Hours] * [Rate] * [Complexity] * [Efficiency] from Hours

我更愿意在 SQL 查询而不是 SSRS 表中执行此舍入,因为我们试图使表保持“非智能”,以便我们可以将所有逻辑封装在 SQL 查询本身中。有什么建议吗?

最佳答案

这里有两个问题。

首先是四舍五入。这可以通过 SQL 中的 Round 函数轻松完成:

SELECT Round(8660.125, 2);
-- returns 8660.130

第二个,如您所见,这仍然返回小数点后 3 位数字。这是由于数据类型。你得到了你的四舍五入值,但它仍然显示一个额外的数字。

你可以这样解决:

SELECT Convert(decimal(16, 2), 8660.125);
--returns 8660.13 by implicitly rounding--you could round first but not needed

但是,上面这两个值在数值上相同。在我看来,您根本不应该在 SQL Server 端处理表示。如果您需要两位小数,只需将 SSRS 报告中的单元格格式设置为 #.00。这将确保您获得所需的(四舍五入的)小数位数,无论如何!不需要任何功能。只是一个简单的属性。

日期也是一样的道理。日期的基础值只是一个数字。但是有无数种方法可以向用户显示日期——使用长名称或各部分的不同顺序或使用不同的分隔符。每次更改日期格式时,您都会回到 SQL 并更改您的 Convert() 样式吗?

您不希望 SQL Server 确定这些数字在报表中的字体、颜色、大小、填充、样式、位置或可见性。这些也都必须在设计时手动设置。那么为什么值的显示方式(当值完全相等时)会有所不同呢?在我看来,将其插入 SQL 查询会将关注的区域移到错误的位置。那是在不需要存在的查询中增加复杂性(而不是“智能”)!而且我也没有看到将单元格的数字格式设置为“增加智能”。

这是一个表示问题,因此请将其放在所有其他表示元素都已处理的适当位置 - SSRS 报告。

更新

我可以想到一种情况,您希望在查询中执行转换,这时该值将进一步用于更多计算,并且有关所述计算的业务规则需要它。例如,如果您正在计算银行利息,他们可能有这样的规则:“在第 1 步之后舍入到小数点后 4 位,然后在第 3 步之后最终舍入到小数点后 2 位(美元和美分)”。但这是一个不同的故事:现在值(value)很重要,而不仅仅是它的展示

关于SQL 从 3 位小数舍入到 2 位小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14635110/

相关文章:

SQL Server - 将 TIME 值舍入到下一分钟

python - 具有可过滤属性的 Django 模型

c# - 从 C# 调用 SSRS 报告时仅主报告显示数据子报告给出错误

mysql - sql除了like查询

sql-server - SSRS 动态字符串表达式

reporting-services - tablix/matrix 中具有动态列的数据集

c# - 四舍五入到最接近的整数

在摊销表中四舍五入

php - Laravel 4 - 数据排序

.net - ADO.Net 最佳实践 - 进行异步数据库调用时的单连接与多连接