我有一个SSRS 2008报告,其数据集运行一个返回计算列的SQL查询。此数据集填充报告中的表格。
计算列最多返回4位小数。我想舍入到最接近的2位小数。即8660.125应为8660.13,1487.8521应为1487.85
查询样本:
select [Hours] * [Rate] * [Complexity] * [Efficiency] from Hours
我希望在SQL Query而不是SSRS表中执行此舍入,因为我们试图保持表“非智能”,因此我们可以将所有逻辑封装在SQL查询本身中。建议?
答案 0 :(得分:7)
这里有两个问题。
首先是四舍五入。这可以通过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位小数(美元和美分)。”但这是一个不同的故事:现在值很重要,而不仅仅是显示。
答案 1 :(得分:0)
尝试使用CAST
之类的东西 - 它应该为你处理舍入。
SELECT CAST(col as DECIMAL(10,2))
这是SQL Fiddle。
使用上面的示例查询,请使用:
select CAST([Hours] * [Rate] * [Complexity] * [Efficiency] as DECIMAL(10,2)) from Hours
祝你好运。