CHill60
Вы должны избегать использования курсора для этого - помните, что SQL Server установлен на основе.
Ваши инструкции на самом деле не имеют большого смысла - например, вы не будете использовать значения обмена валюты только на отрицательные значения. Я думаю, что вы имеете в виду, что вам нужны суммы в долларах США.
Это также немного попахивает домашним заданием, поэтому то, что следует ниже, не является полным решением - кроме того, мой первоначальный комментарий выше применим.
Я использовал следующие тестовые данные
declare @invoice_dump table (InvoiceNo int, currency varchar(4), Amount decimal(15,2))
declare @currency_exchange_value table (FromCurrency varchar(4), ToCurrency varchar(4), ExchangeValue decimal(15,4))
insert into @invoice_dump (InvoiceNo, currency, Amount) values
(5257,'USD',9450.00),(5257,'INR',-35212.32)
insert into @currency_exchange_value (FromCurrency,ToCurrency,ExchangeValue) values
('INR','USD',0.2666)
Обратите внимание, что я действительно не мог установить, что вы имели в виду в своих комментариях о дубликатах, поэтому я не обслуживал их явно.
Этот фрагмент sql
SELECT *, ABS(Amount) as posValue -- Note 1
FROM @invoice_dump I
LEFT OUTER JOIN @currency_exchange_value C ON I.currency = C.FromCurrency -- Note 2
Дает следующие результаты
InvoiceNo currency Amount FromCurrency ToCurrency ExchangeValue posValue
5257 USD 9450.00 NULL NULL NULL 9450.00
5257 INR -35212.32 INR USD 0.2666 35212.32
Примечание 1 - функция ABS() даст абсолютное значение столбца - эффективно изменяя отрицательное значение на положительное
Примечание 2 - Пример использования соединения для получения биржевой стоимости.
Проблема теперь в том, что у нас есть две строки, но мы хотим получить данные из обеих... лучший способ справиться с этим-использовать PIVOT, например
SELECT * FROM
(SELECT *, ABS(Amount) as posValue
FROM @invoice_dump I
LEFT OUTER JOIN @currency_exchange_value C ON I.currency = C.FromCurrency
) src
PIVOT
(
SUM(Amount) FOR currency IN (USD, INR) -- Note 3
)pvt
Примечание 3 - Обратите внимание, что валюта теперь является именем столбца
Вот и получается результат
5257 NULL NULL NULL 9450.00 9450.00 NULL
5257 INR USD 0.2666 35212.32 NULL -35212.32
так что я, очевидно, не совсем правильно понял ... Мне нужна одна строка на счет, поэтому я буду использовать GROUP BY
SELECT InvoiceNo, MAX(FromCurrency) as FromCurrency, MAX(ToCurrency) as ToCurrency,
MAX(ExchangeValue) as ExchangeValue, MAX(USD) as USD, MAX(INR) as INR
FROM
(SELECT *, ABS(Amount) as posValue
FROM @invoice_dump I
LEFT OUTER JOIN @currency_exchange_value C ON I.currency = C.FromCurrency
) src
PIVOT
(
SUM(Amount) FOR currency IN (USD, INR)
)pvt
GROUP BY InvoiceN
Что и дает результаты
InvoiceNo FromCurrency ToCurrency ExchangeValue USD INR
5257 INR USD 0.2666 9450.00 -35212.32
Теперь, когда у вас есть все результаты в одной строке, вы можете добавить их во временную таблицу или использовать общее табличное выражение или даже подключить свое простое уравнение.