在SQL server中使用case

Pra*_*els 1 sql sql-server sql-server-2014

我正在尝试CASE在SQL Server中使用一个语句.我正在尝试更新ProfitUSD列中从Profit列中获取的值乘以列中的转换率Rate以获取ProfitUSD(ProfitUSD列).基本上,我只是试图通过乘以从Rate列中获取的相应转换率将利润转换为美元条款.

任何帮助将非常感激 :)

这里的问题是当我运行这个时,我收到以下错误:

消息512,级别16,状态1,行1
子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做.该语句已终止

码:

update dbo.[5 Mins]
set ProfitUSD =
    case
    when Region='AEX 30 Netherlands' then Profit*(select rate from dbo.rates where Region='AEX 30 Netherlands') 
    when Region='ASX Australia' then Profit*(select Rate from dbo.rates where Region='ASX Australia')
    when Region='Athens' then Profit*(select Rate from dbo.rates where Region='Athens')
    when Region='Austria' then Profit*(select Rate from dbo.rates where Region='Austria')
    when Region='Bahrain' then Profit*(select Rate from dbo.rates where Region='Bahrain')
    when Region='Bovespa' then Profit*(select Rate from dbo.rates where Region='Bovespa')
    when Region='Brussels' then Profit*(select Rate from dbo.rates where Region='Brussels')
    when Region='Bucharest' then Profit*(select Rate from dbo.rates where Region='Bucharest')
    when Region='Budapest' then Profit*(select Rate from dbo.rates where Region='Budapest')
    when Region='Bulgaria' then Profit*(select Rate from dbo.rates where Region='Bulgaria')
    when Region='CAC 40' then Profit*(select Rate from dbo.rates where Region='CAC 40')
    when Region='CBOT' then Profit*(select Rate from dbo.rates where Region='CBOT')
    when Region='CME Globex' then Profit*(select Rate from dbo.rates where Region='CME Globex')
    when Region='Comex Metal' then Profit*(select Rate from dbo.rates where Region='Comex Metal')
    when Region='Copanhagen' then Profit*(select Rate from dbo.rates where Region='Copanhagen')
    when Region='DJ Euro Stoxx 50' then Profit*(select Rate from dbo.rates where Region='DJ Euro Stoxx 50')
    when Region='Doha' then Profit*(select Rate from dbo.rates where Region='Doha')
    when Region='Egypt' then Profit*(select Rate from dbo.rates where Region='Egypt')
    when Region='FTSE'  then Profit*(select Rate from dbo.rates where Region='FTSE')
    when Region='FTSE Malaysia' then Profit*(select Rate from dbo.rates where Region='FTSE Malaysia')
    when Region='Hang Seng' then Profit*(select Rate from dbo.rates where Region='Hang Seng')
    when Region='Helsinki' then Profit*(select Rate from dbo.rates where Region='Helsinki')
    when Region='ICE Nybot' then Profit*(select Rate from dbo.rates where Region='ICE Nybot')
    when Region='ICEX Iceland' then Profit*(select Rate from dbo.rates where Region='ICEX Iceland')
    when Region='Istanbul' then Profit*(select Rate from dbo.rates where Region='Istanbul')
    when Region='Johannesberg' then Profit*(select Rate from dbo.rates where Region='Johannesberg')
    when Region='Lima' then Profit*(select Rate from dbo.rates where Region='Lima')
    when Region='Lisbon' then Profit*(select Rate from dbo.rates where Region='Lisbon')
    when Region='Moroccan' then Profit*(select Rate from dbo.rates where Region='Moroccan')
    when Region='Moscow' then Profit*(select Rate from dbo.rates where Region='Moscow')
    when Region='New Zeland NZX' then Profit*(select Rate from dbo.rates where Region='New Zeland NZX')
    when Region='Nigeria 30 Lagos' then Profit*(select Rate from dbo.rates where Region='Nigeria 30 Lagos')
    when Region='Nse All' then Profit*(select Rate from dbo.rates where Region='Nse All')
    when Region='Oman' then Profit*(select Rate from dbo.rates where Region='Oman')
    when Region='Oslo' then Profit*(select Rate from dbo.rates where Region='Oslo')
    when Region='Parague' then Profit*(select Rate from dbo.rates where Region='Parague')
    when Region='Philippines' then Profit*(select Rate from dbo.rates where Region='Philippines')
    when Region='Santiago' then Profit*(select Rate from dbo.rates where Region='Santiago')
    when Region='Saudi' then Profit*(select Rate from dbo.rates where Region='Saudi')
    when Region='Shanghai' then Profit*(select Rate from dbo.rates where Region='Shanghai')
    when Region='Slovenia' then Profit*(select Rate from dbo.rates where Region='Slovenia')
    when Region='Spain' then Profit*(select Rate from dbo.rates where Region='Spain')
    when Region='STI Singapore' then Profit*(select Rate from dbo.rates where Region='STI Singapore')
    when Region='Stockholm' then Profit*(select Rate from dbo.rates where Region='Stockholm')
    when Region='Swiss' then Profit*(select Rate from dbo.rates where Region='Swiss')
    when Region='Toronto' then Profit*(select Rate from dbo.rates where Region='Toronto')
    when Region='TSE Tokyo' then Profit*(select Rate from dbo.rates where Region='TSE Tokyo')
    when Region='Tunisia' then Profit*(select Rate from dbo.rates where Region='Tunisia')
    when Region='Turquise Italy' then Profit*(select Rate from dbo.rates where Region='Turquise Italy')
    when Region='Warsaw' then Profit*(select Rate from dbo.rates where Region='Warsaw')
    when Region='NASDAQ 100' then Profit*(select Rate from dbo.rates where Region='NASDAQ 100')
    when Region='Abu Dhabi' then Profit*(select Rate from dbo.rates where Region='Abu Dhabi')
    when Region='Nordic' then Profit*(select Rate from dbo.rates where Region='Nordic')
    when Region='NYSE All' then Profit*(select Rate from dbo.rates where Region='NYSE All')
    when Region='Seoul' then Profit*(select Rate from dbo.rates where Region='Seoul')
    when Region='Taiwan' then Profit*(select Rate from dbo.rates where Region='Taiwan')
    when Region='Ukraine' then Profit*(select Rate from dbo.rates where Region='Ukraine')
    else ProfitUSD
    end
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 7

这不会解决您的问题,但使用updatewith join将使查询更容易使用:

update f
    set ProfitUSD = Profit * coalesce(Rate, 1.0)
    from dbo.[5 Mins] f left join
         dbo.rates r
         on f.Region = r.Region;
Run Code Online (Sandbox Code Playgroud)

请注意,这假设表中没有其他区域可能匹配,但您没有提及case.这似乎是一个合理的假设.

此版本将起作用,因为它不会生成错误.问题是一个或多个区域中有一行或多行rates.你可以找到它们:

select region, count(*)
from dbo.rates r
group by region
having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

然后修复数据.或者决定你想要哪一行并修复你的逻辑.在这个版本中,逻辑将更容易修复.