【问题标题】:Operand data type varchar is invalid for divide operator操作数数据类型 varchar 对除法运算符无效
【发布时间】:2016-05-11 07:19:43
【问题描述】:

我刚开始使用 SQL,我有一个非常基本的问题:

我尝试划分 2 列(金额/费率) - 我将它们从 'money' 转换为 'INT' 但是当我尝试执行时它给了我这个错误:

操作数数据类型 varchar 对除法运算符无效。

这是我输入的查询:

select referenceid, 
       CONVERT(decimal(15,3), sellamount) as 'amount', 
       CONVERT(decimal(15,3), rateactual) as 'Rate',
       CONVERT(decimal(15,3), 'amount' / 'rate') as 'local amount'
FROM currencyfxconversions

谁能帮我理解我做错了什么?

【问题讨论】:

  • 'Rate' 属于varchar 类型。您可能需要使用convert(decimal(15,3),'amount' / convert(decimal(15,3), rateactual) 而不是convert(decimal(15,3),'amount' / 'rate')
  • sql-server 和 MySql 是两个不同的产品。
  • 你想做什么? 'rate' 是一个包含字符 'r'、'a'、't' 和 'e' 的字符串。您不能将字符串 'amount' 与字符串 'rate' 分开。如果要使用别名,请使用标准双引号,例如"rate" - 单引号用于字符串文字。但是:你不能在定义它的同一个选择子句中使用别名,因为没有评估值的顺序(即as "local amount" 行可能在as "amount" 行之前执行)。跨度>
  • 那么sellamountrateactual是什么类型?他们不是已经是数字了吗?然后CONVERT 什么都不做。也许您想将它们 strings 以某种格式(例如 3 位小数)来显示?然后使用适当的格式化函数(在 MySQL 和 SQL Server 中可能不同)。
  • 谢谢你们,这很有帮助!所以我输入了以下查询并且它有效!选择 referenceid,CONVERT(decimal(15,3), sellamount) 作为 'amount',convert(decimal(15,3), rateactual) 作为 'Rate',(convert(decimal(15,3), sellamount) / convert( decimal(15,3), rateactual)) FROM currencyfxconversions。

标签: sql sql-server


【解决方案1】:

这样试试,

SELECT referenceid
    ,CONVERT(DECIMAL(15, 3), sellamount) AS 'amount'
    ,CONVERT(DECIMAL(15, 3), rateactual) AS 'Rate'
    ,CONVERT(DECIMAL(15, 3), (CONVERT(DECIMAL(15, 3), sellamount) / CONVERT(DECIMAL(15, 3), rateactual))) AS 'local amount'
FROM currencyfxconversions

【讨论】:

  • 谢谢,我试过了:(convert(decimal(15,3), sellamount) / convert(decimal(15,3), rateactual)) 成功了:)
【解决方案2】:

在原始查询中,

convert(decimal(15,3),'amount' / 'rate')

必须替换为:

CONVERT(CONVERT(decimal(15,3), sellamount) / CONVERT(decimal(15,3), rateactual))

【讨论】:

  • 谢谢,这很有帮助!我按照你的建议做了,但删除了第一个“CONVERT”,它起作用了:)
【解决方案3】:

您的问题是您正在使用在相同上下文中使用的列。您不能将 am 别名用作选择上下文中的表列。您必须重复上次的别名查询,如下所示:

SELECT referenceid
,CONVERT(DECIMAL(15, 3), sellamount) AS 'amount'
,CONVERT(DECIMAL(15, 3), rateactual) AS 'Rate'
,CONVERT(DECIMAL(15, 3), (CONVERT(DECIMAL(15, 3), sellamount) / convert(DECIMAL(15, 3), rateactual))) AS 'local amount'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多