РАЗДЕЛИТЕ СТРОКУ, ПОТОМ ИЗМЕНИТЕ ЕГО ДЕСЯТИЧНО, И МНОГОКРАТНО ЭТО ЗНАЧИТЕ В ДРУГОЙ ТАБЛИЦЕ - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно отделиться от Таблицы 1, Col1, которая содержит «валюта» и «значение» или «;».

Table1

Col1      
GBP;185.00   
EUR;152.46   
;                         
SEK;364.55    
USD;364.55   

Затем в Таблице 2 я использую 'CurrCode' для объединения с 'Значением' из Таблицы 1.

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

ПРИМЕЧАНИЕ. Если для валюты выбрано EUR, CurrValue равно NULL, а ValueEUR совпадает с LocalValue.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Вот код, который решил это:

SELECT 
    t.Col1
    ,COALESCE(TRY_CONVERT(DECIMAL(18,3),SUBSTRING(t.Col1,CHARINDEX(';',t.Col1)+1, 
 LEN(t.Col1))),0) AS LocalValue
    ,COALESCE(c.CurrValue,0) as CurrValue
    ,SUBSTRING (t.Col1, 0, CHARINDEX(';',t.Col1)) AS Currency
,COALESCE((c.CurrValue*TRY_CONVERT(DECIMAL(18,3),SUBSTRING(t.Col1,CHARINDEX(';',t.Col1)+1,LEN(t.Col1)))),COALESCE(TRY_CONVERT(DECIMAL(18,3),SUBSTRING(t.Col1,CHARINDEX(';',t. 
Col1)+1, LEN(t.Col1))),0)) AS ValueEUR

from Table1 as t
left join Table1 as c
on c.CurrCode = SUBSTRING (Col1, 0, CHARINDEX(';',Col1))
0 голосов
/ 24 сентября 2019

Я создал 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...