sql - 将 varchar 值转换为数据类型 numeric 时 SQL 转换失败
问题描述
我在使用以下 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
表情也不例外。
根据 SQL 的规则,数字胜过字符串,因此 SQL 尝试将字符串转换为数字——这就是正在发生的事情。
只需在表达式中使用'0'
而不是:0
case
(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]
推荐阅读
- python - 如何仅计算基于多个月的新用户反应,在 Python Pandas 的 CSV 的不同页面中?
- javascript - 等待js加载后再抓取
- ruby-on-rails - 如何使用 Docker 交互模式粘贴多行命令但不评估?
- javascript - `window.x` 全局变量在浏览器调试断点刷新期间持续存在
- python - python datetime 模块中的 12 小时制,PM 和 AM 不影响日期时间
- json - 无法从谷歌表格 API 链接访问 JSON 数据
- networking - Docker 在 Debian Bullseye 中编写
- python - 迁移学习中的问题:在训练 CRNN 和 CTC 损失时,损失函数的值为 nan
- html - 如何按升序重新排列卡片 django
- javascript - Mongoose 编译后无法覆盖“客户”模型