nvarchar转numeric报错:含货币符号字段的转换及聚合问题咨询
解决nvarchar转numeric的转换报错问题
报错的核心原因是Ordered_product_sales字段包含$符号,直接执行CAST会因为非数值字符导致转换失败,同时原WHERE条件的判断逻辑也不匹配实际数据格式。
步骤1:排查脏数据
先找出所有无法转换为数值的异常数据,方便提前清理:
SELECT Ordered_product_sales FROM [dbo].[salesDashboard] WHERE TRY_CAST(REPLACE(Ordered_product_sales, '$', '') AS NUMERIC(10,2)) IS NULL AND Ordered_product_sales IS NOT NULL
如果使用的是SQL Server 2012之前的版本,不支持TRY_CAST,可以用ISNUMERIC替代:
SELECT Ordered_product_sales FROM [dbo].[salesDashboard] WHERE ISNUMERIC(REPLACE(Ordered_product_sales, '$', '')) = 0 AND Ordered_product_sales IS NOT NULL
步骤2:修正聚合查询
清理字段中的$符号后再转换,同时修正WHERE条件的判断逻辑:
方案1(推荐,支持SQL Server 2012+)
使用TRY_CAST避免个别脏数据导致查询失败:
SELECT [Time], SUM(TRY_CAST(REPLACE([Ordered_product_sales], '$', '') AS NUMERIC(10, 2))) AS Sales_per_day, SUM(CAST([Units_ordered] AS INT)) AS num_of_units_ordered FROM [dbo].[salesDashboard] WHERE TRY_CAST(REPLACE([Ordered_product_sales], '$', '') AS NUMERIC(10,2)) IS NOT NULL AND TRY_CAST(REPLACE([Ordered_product_sales], '$', '') AS NUMERIC(10,2)) <> 0.00 GROUP BY Time
方案2(兼容旧版SQL Server)
用ISNUMERIC过滤可转换的数据:
SELECT [Time], SUM(CAST(REPLACE([Ordered_product_sales], '$', '') AS NUMERIC(10, 2))) AS Sales_per_day, SUM(CAST([Units_ordered] AS INT)) AS num_of_units_ordered FROM [dbo].[salesDashboard] WHERE ISNUMERIC(REPLACE(Ordered_product_sales, '$', '')) = 1 AND CAST(REPLACE(Ordered_product_sales, '$', '') AS NUMERIC(10,2)) <> 0.00 AND Ordered_product_sales IS NOT NULL GROUP BY Time
关键说明
- 必须先通过
REPLACE([Ordered_product_sales], '$', '')移除美元符号,否则带符号的字符串无法直接转换为数值类型。 - 原WHERE条件中
Ordered_product_sales <> '0.00'不生效,因为实际数据是$0.00格式,需要清理后判断数值是否为0。 TRY_CAST会将无法转换的值返回NULL,聚合时自动忽略;ISNUMERIC存在一定局限性(比如会将$本身、逗号等误判为合法数值),因此优先推荐使用TRY_CAST。
内容的提问来源于stack exchange,提问作者MarsRoboters
相关产品推荐
相关产品推荐

