您好我正在尝试根据案例计算2列值,具体取决于第3列中的内容。
以下代码在将数据类型varchar转换为数字时出错。
我认为它正在尝试将货币列设置为新值而不是测试。
任何人都可以帮助我的语法。
三江源。
SELECT dbo.ORDR.DocTotal,
dbo.ORDR.DocTotalFC,
test = case
when dbo.RDR1.Currency = 'GBP' then dbo.ORDR.DocTotal - dbo.ORDR.VatSum
when dbo.RDR1.Currency = 'USD' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC
when dbo.RDR1.Currency = 'EUR' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC
else 'other'
end
FROM dbo.RDR1 INNER JOIN
dbo.ORDR ON dbo.RDR1.DocEntry = dbo.ORDR.DocEntry
答案 0 :(得分:7)
案例表达的其他部分的问题
else 'other'
由于case表达式在其他方案中返回某些整数类型的值,但在else部分中,您返回的字符串值与先前的值不兼容。尝试用一些整数值替换else条件作为默认值
答案 1 :(得分:2)
错误是由我们返回{else}的其他情况引起的。{1}}。手头的列值似乎是other
或某种形式的money
。
我们无法在所选列中混合数据类型。因此,我们不能在case语句中混合类型,因为它返回单个列。
理想情况下,您应将其他条件设置为decimal(x,x)
之类的货币金额,以免错误输出并保持一致。
将来,您0.0
的{{1}}部分是查找这些错误的绝佳地点,正如您在评论中看到的那样。这通常是开发人员尝试混合数据类型的地方。
如果必须返回else
,请将其他返回值转换为varchar:
case
答案 2 :(得分:1)
知道了。谢谢你的链接:)
update dbo.ORDR
set DiscSum = case
when dbo.RDR1.Currency = 'GBP' then dbo.ORDR.DocTotal - dbo.ORDR.VatSum
when dbo.RDR1.Currency = 'USD' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC
when dbo.RDR1.Currency = 'EUR' then dbo.ORDR.DocTotalFC - dbo.ORDR.VatSumFC
end
FROM dbo.RDR1 INNER JOIN
dbo.ORDR ON dbo.RDR1.DocEntry = dbo.ORDR.DocEntry