SQL 服务器中的使用案例
Using case in SQL server
我正在尝试在 SQL 服务器中使用 CASE
语句。我正在尝试更新 ProfitUSD
列,其中从 Profit
列获取的值乘以从 Rate
列获取的转换率以获得以美元计的 Profit
(ProfitUSD
列)。基本上,我只是想通过乘以从 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
这不会解决您的问题,但使用 update
和 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;
请注意,这假设 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.
中的重复问题
我正在尝试在 SQL 服务器中使用 CASE
语句。我正在尝试更新 ProfitUSD
列,其中从 Profit
列获取的值乘以从 Rate
列获取的转换率以获得以美元计的 Profit
(ProfitUSD
列)。基本上,我只是想通过乘以从 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
这不会解决您的问题,但使用 update
和 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;
请注意,这假设 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.