3

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

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

查询示例:

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

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

4

2 回答 2

7

这里有两个问题。

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

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 位(美元和美分)。” 但那是另一回事:现在价值很重要,而不仅仅是它的展示

于 2013-01-31T21:09:48.067 回答
0

尝试使用类似的东西CAST——它应该为你处理四舍五入。

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

这是SQL 小提琴

使用上面的示例查询,使用:

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

祝你好运。

于 2013-01-31T21:09:29.753 回答