我在执行以下 SQL 查询时遇到一些困难:
SELECT
SUM(ArTrnDetail.NetSalesValue) AS [Price],
'ExecuteSubReport(813, 0, Job)' AS [LaborCost],
'ExecuteSubReport(815, 0, Job)' AS [MaterialCost],
'ExecuteSymbolicMath(LaborCost + MaterialCost)' AS [TotalCost],
'ExecuteSymbolicMath(Price - (LaborCost + MaterialCost))' AS [Margin],
CASE
WHEN SUM(ArTrnDetail.NetSalesValue) = 0
THEN 0
ELSE 'ExecuteSymbolicMath(1 - (TotalCost / Price))' <-- Where it's failing
END AS [MarginPct]
ExecuteSubReport
和ExecuteSymbolicMath
是公司功能。 ExecuteSymbolicMath
基本上去除不需要的字符,如 $ 和逗号,进行数学计算并将结果作为字符串返回。该列的最终结果是 0-1 之间的小数点(2 位)。当我尝试运行查询时,我收到一条错误消息,指出它无法将 varchar 转换为数字。我已经尝试了几乎所有我能想到的方法。我试过替换、转换、转换、str。
非常感谢您的帮助!
最佳答案
SQL 表达式只有一种类型。 case
表达式也不异常(exception)。
根据 SQL 的规则,数字胜过字符串,因此 SQL 会尝试将字符串转换为数字——这就是正在发生的事情。
只需在 case
表达式中使用 '0'
而不是 0
:
(CASE WHEN SUM(ArTrnDetail.NetSalesValue) = 0
THEN '0'
ELSE 'ExecuteSymbolicMath(1-(TotalCost/Price))' <-- Where it's failing
END) AS [MarginPct]
或者,如果你真的想要计算,去掉所有的单引号:
(CASE WHEN SUM(ArTrnDetail.NetSalesValue) = 0
THEN 0
ELSE ExecuteSymbolicMath(1-(TotalCost/Price))
END) AS [MarginPct]
关于将 varchar 值转换为数字数据类型时 SQL 转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65833799/