根据第3列值计算2列

时间:2017-04-12 13:30:39

标签: sql-server

您好我正在尝试根据案例计算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

3 个答案:

答案 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