当 SELECT 子句中存在 ISNULL 时如何舍入值中的小数?
How to round off decimals in values when ISNULL exists in SELECT clause?
我在这个数据透视表中四舍五入小数点时遇到问题 table:
enter image description here
代码如下:
SELECT P.LastName, [Bike Racks]=ISNULL([Bike Racks],0), [Bottles and Cages]=ISNULL([Bottles and Cages],0), [Bottom Brackets]=ISNULL([Bottom Brackets],0), [Brakes]=ISNULL([Brakes],0)
FROM #TabPivot
PIVOT (
SUM(Total)
FOR Name IN ( [Bike Racks], [Bottles and Cages], [Bottom Brackets], [Brakes])) AS P
ORDER BY P.LastName;
我尝试使用 ROUND 和 CAST...AS NUMERIC 函数,但没有用(也许我做错了什么):
SELECT P.LastName, ROUND([Bike Racks]=ISNULL([Bike Racks],0),2), ...
SELECT P.LastName, ROUND(([Bike Racks]=ISNULL([Bike Racks],0)),2), ...
SELECT P.LastName, ROUND(([Bike Racks]=ISNULL([Bike Racks],0), [Bottles and Cages]=ISNULL([Bottles and Cages],0), [Bottom Brackets]=ISNULL([Bottom Brackets],0), [Brakes]=ISNULL([Brakes],0)),2)
SELECT P.LastName, CAST([Bike Racks]=ISNULL([Bike Racks],0) AS Numeric(15,2))
SELECT P.LastName, CAST([Bike Racks]=ISNULL([Bike Racks],0)) AS Numeric(15,2)
你能帮帮我吗?
列名不能在函数内部,而是在函数外部,试试这个:
SELECT [Bike Racks] = cast(isnull(0.66666, 0) as decimal(18,2))
作为替代方案,当您使用 AS 语法指定列名时可能会更清楚:
SELECT cast(isnull(0.66666, 0) as decimal(18,2)) AS [Bike Racks]
您只需将数据转换为 十进制 数据类型并指定正确的 scale 和 precision.
例如
declare @v float=14
select @v/3.066, Cast(@v/3.066 as decimal (5,2))
Returns
4.5662100456621 4.57
试试这个:
Select Convert(Decimal (17,0),[Bike Racks]) AS [Bike Racks with convert]
,Floor(ISNULL([Bike Racks], 0)) AS [Bike Racks round down number]
,Ceiling(ISNULL([Bike Racks], 0)) AS [Bike Racks round to up number]
您可以在下面的示例中找到其他可用的圆形模型:
DECLARE @value decimal(10,2)
SET @value = 11.05
SELECT ROUND(@value, 1) -- 11.10
SELECT ROUND(@value, -1) -- 10.00
SELECT ROUND(@value, 2) -- 11.05
SELECT ROUND(@value, -2) -- 0.00
SELECT ROUND(@value, 3) -- 11.05
SELECT ROUND(@value, -3) -- 0.00
SELECT CEILING(@value) -- 12
SELECT FLOOR(@value) -- 11
我在这个数据透视表中四舍五入小数点时遇到问题 table:
enter image description here
代码如下:
SELECT P.LastName, [Bike Racks]=ISNULL([Bike Racks],0), [Bottles and Cages]=ISNULL([Bottles and Cages],0), [Bottom Brackets]=ISNULL([Bottom Brackets],0), [Brakes]=ISNULL([Brakes],0)
FROM #TabPivot
PIVOT (
SUM(Total)
FOR Name IN ( [Bike Racks], [Bottles and Cages], [Bottom Brackets], [Brakes])) AS P
ORDER BY P.LastName;
我尝试使用 ROUND 和 CAST...AS NUMERIC 函数,但没有用(也许我做错了什么):
SELECT P.LastName, ROUND([Bike Racks]=ISNULL([Bike Racks],0),2), ...
SELECT P.LastName, ROUND(([Bike Racks]=ISNULL([Bike Racks],0)),2), ...
SELECT P.LastName, ROUND(([Bike Racks]=ISNULL([Bike Racks],0), [Bottles and Cages]=ISNULL([Bottles and Cages],0), [Bottom Brackets]=ISNULL([Bottom Brackets],0), [Brakes]=ISNULL([Brakes],0)),2)
SELECT P.LastName, CAST([Bike Racks]=ISNULL([Bike Racks],0) AS Numeric(15,2))
SELECT P.LastName, CAST([Bike Racks]=ISNULL([Bike Racks],0)) AS Numeric(15,2)
你能帮帮我吗?
列名不能在函数内部,而是在函数外部,试试这个:
SELECT [Bike Racks] = cast(isnull(0.66666, 0) as decimal(18,2))
作为替代方案,当您使用 AS 语法指定列名时可能会更清楚:
SELECT cast(isnull(0.66666, 0) as decimal(18,2)) AS [Bike Racks]
您只需将数据转换为 十进制 数据类型并指定正确的 scale 和 precision.
例如
declare @v float=14
select @v/3.066, Cast(@v/3.066 as decimal (5,2))
Returns
4.5662100456621 4.57
试试这个:
Select Convert(Decimal (17,0),[Bike Racks]) AS [Bike Racks with convert]
,Floor(ISNULL([Bike Racks], 0)) AS [Bike Racks round down number]
,Ceiling(ISNULL([Bike Racks], 0)) AS [Bike Racks round to up number]
您可以在下面的示例中找到其他可用的圆形模型:
DECLARE @value decimal(10,2)
SET @value = 11.05
SELECT ROUND(@value, 1) -- 11.10
SELECT ROUND(@value, -1) -- 10.00
SELECT ROUND(@value, 2) -- 11.05
SELECT ROUND(@value, -2) -- 0.00
SELECT ROUND(@value, 3) -- 11.05
SELECT ROUND(@value, -3) -- 0.00
SELECT CEILING(@value) -- 12
SELECT FLOOR(@value) -- 11