2013-01-31 176 views
3

我有一个SSRS 2008报告,其数据集运行一个返回计算列的SQL查询。该数据集填充报表中的表格。SQL从小数点后3位舍入到2位小数

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

样品查询:

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

我会perfer,因为我们正试图保持执行的SQL查询此舍入,而不是SSRS表表“非智能”,因此我们可以将所有的逻辑封装在SQL查询本身中。建议?

+0

如果您发布了一个示例查询或您的查询的摘录,它可能会有所帮助。 –

+0

@Aaron ...会做 – MikeTWebb

+0

通常在报告中,四舍五入是在显示屏上完成的,而不是改变底层数据。如果您不需要,请不要执行数据转换。 – DOK

回答

7

这里有两个问题。

第一个是舍入。这可以方便地与Round功能SQL来完成:

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报告。

更新

我能想到的一个场景,你会想在您的查询进行转换,那就是当值将在更多的计算可以进一步使用和有关业务规则所述计算需要它。例如,如果你计算银行利息,他们可能会有规则,比如“在第一轮结束后保留​​4位小数,然后在第三步后最后到达小数点后两位(美元和美分)。”但这是一个不同的故事:现在的很重要,不仅仅是它的显示

+0

@Erik ....很棒的信息。在所有方面。而且,我同意你在表示层与数据层之间的关系。我会做出这个转变 – MikeTWebb

0

尝试类似于使用CAST - 它应该为您处理四舍五入。

SELECT CAST(col as DECIMAL(10,2)) 

这是SQL Fiddle

通过上面的示例查询,使用方法:

select CAST([Hours] * [Rate] * [Complexity] * [Efficiency] as DECIMAL(10,2)) from Hours 

好运。