SQL对计算表达式执行round保留两位小数后仍显示四位小数问题
你遇到的问题本质是CASE表达式的返回类型隐式转换导致的:CASE语句会自动将所有分支的返回值对齐到精度最高的那个数据类型,你原代码里ELSE分支直接返回了原本的UnitPrice字段,这个字段本身的类型是保留4位小数的数值类型,所以哪怕其他分支用ROUND计算出了两位小数的结果,最终整个CASE的返回值会被自动补零到4位小数。
解决方法
- 方案1:统一所有分支的小数精度,给ELSE分支也加上ROUND处理
修改后的代码如下:
select p.ProductName, p.UnitPrice, s.CompanyName, c.CategoryName, case when c.CategoryName in ('Condiments', 'Beverages') then round((UnitPrice + (UnitPrice * .2)), 2) when c.CategoryName in ('meat/poultry', 'seafood') then round((UnitPrice + (UnitPrice * .15)), 2) when s.CompanyName = 'New Orleans Cajun Delights' then round((UnitPrice + (UnitPrice * .08)), 2) else round(p.unitprice, 2) end as NewUnitPrice from products p join Categories c on c.CategoryID = p.CategoryID join Suppliers s on s.SupplierID = p.SupplierID
- 方案2:直接对整个CASE表达式做强制类型转换,固定返回2位小数,不同数据库语法稍有差异:
- MySQL/PostgreSQL 写法:
CAST( [你的CASE语句] AS DECIMAL(10,2) ) as NewUnitPrice - SQL Server 写法:
CONVERT(DECIMAL(10,2), [你的CASE语句]) as NewUnitPrice
- MySQL/PostgreSQL 写法:
如果完成上述修改后查询结果还是显示4位小数,属于数据库客户端的默认展示规则问题,可以在客户端的显示设置中调整小数展示位数。
内容的提问来源于stack exchange,提问作者James Krueger
相关产品推荐
相关产品推荐

