我需要从表 1 中分离出包含“货币”和“价值”或“;”的 Col1。
Table1
Col1
GBP;185.00
EUR;152.46
;
SEK;364.55
USD;364.55
然后在表 2 中,我使用“CurrCode”与表 1 中的“Value”连接。
Table2
CurrValue CurrCode
11.01 GBP
NULL EUR
---
9.44 SEK
9.01 USD
我构建了这段代码,但数据量太大,它只能工作到 9000 列然后崩溃。有没有办法解决这个问题?
SELECT
Col1
,(reverse(substring(reverse(Col1),0,charindex(';',reverse(Col1))))) as LocalValue
,c.currVALUE
,substring(Col1,1,charindex(';',Col1)-1) as Currency
,case when Col1 like 'EUR;%' then (reverse(substring(reverse(Col1),0,charindex(';',reverse(Col1)))))
else try_convert(numeric(18,5),(reverse(substring(reverse(Col1),0,
charindex(';',reverse(Col1))))))* c.CurrValue
end as ValueEUR
from b
left join c
on c.CurrencyCode = substring(Col1,1,charindex(';',Col1)-1)
所需的结果是一个显示 CurrValue、Currecy 和 ValueEUR 的表(其中 'CurrValue' * 'Localvalue' = 'ValueEUR'):
LocalValue Currency ValueEUR
185.33 GBP 2040.48
152.46 EUR 152.46
0 --- 0
364.55 SEK 3441.35
364.55 USD 3284.60
注意:当 Currency 为 EUR 时,CurrValue 为 NULL,ValueEUR 与 LocalValue 相同。
我已经为演示创建了一个 CTE vTable1。我认为你最好创建一个视图。
IF OBJECT_ID('tempdb..#Table1') IS NOT NULL DROP TABLE #Table1
IF OBJECT_ID('tempdb..#Table2') IS NOT NULL DROP TABLE #Table2
create table #Table1
(
Col1 varchar(100)
)
create table #Table2
(
CurrValue decimal(18,2),
CurrCode varchar(3)
)
INSERT INTO #Table1
values
('GBP;185.00'),
('EUR;152.46'),
(';'),
('DKK;364.55'),
('SEK;364.55'),
('USD;364.55')
INSERT INTO #Table2
VALUES
(11.01, 'GBP'),
(null, 'EUR'),
(null, '---'),
(9.44, 'SEK'),
(9.01, 'USD')
;WITH vTable1 (Currency, Value)
as
(
SELECT SUBSTRING(Col1,0,CHARINDEX(';',Col1)) AS Currency
,TRY_CONVERT(DECIMAL(18,2), SUBSTRING(Col1,CHARINDEX(';',Col1)+1, LEN(Col1))) as Value
FROM #Table1
)
SELECT COALESCE(t1.Value, 0) as CurrValue
,t2.CurrCode as Currency
,CONVERT(DECIMAL(18,2), COALESCE(t2.CurrValue * t1.Value, t1.Value, 0)) AS ValueEUR
FROM vTable1 as t1
RIGHT JOIN #Table2 as t2
on t1.Currency = t2.CurrCode
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句