SQL 服务器中的使用案例

Using case in SQL server

我正在尝试在 SQL 服务器中使用 CASE 语句。我正在尝试更新 ProfitUSD 列,其中从 Profit 列获取的值乘以从 Rate 列获取的转换率以获得以美元计的 ProfitProfitUSD 列)。基本上,我只是想通过乘以从 Rate 列中获取的相应转换率来将利润转换为美元。

任何帮助将不胜感激:)

这里的问题是当我 运行 出现以下错误时:

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated

代码:

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

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

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

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

这个版本可以工作,因为它不会产生错误。问题是一个或多个区域在 rates 中有一行或多行。您可以使用以下方式找到它们:

select region, count(*)
from dbo.rates r
group by region
having count(*) > 1;

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

该错误意味着您的子查询之一(select rate from dbo.rates where region =)正在返回多个值。您在 table.

上至少有一个地区名称有两条(或更多条)记录

您可以(应该)使用 JOIN 而不是巨大的 CASE 语句来进行此更新;添加新区域时会发生什么?

update A set a.profitusd= a.profit*r.rate from dbo.[5 min] A join dbo.rates R on a.region = r.region 

但这并不能解决 rates table.

中的重复问题