2013-01-31 217 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 

好運。