Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Расчет валютных пар в один select?  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
[quot s_ustinov]
ElenaTomsk
пропущено...

Очень сомнительно, что бизнес задача состоит в покупке / продаже валюты.


Клиент купил себе: рома, ракушек, песо, тугриков и хочет понять, сколько на данный момент его активы стоят в той валюте, которую он выбрал как isRoot
3 июл 17, 14:06    [20609002]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Фиг его знает, что я тут наваял...
DECLARE @rates TABLE ( [iso_base] VARCHAR(3), [iso] VARCHAR(3), [base] FLOAT, [rate] FLOAT )
;
INSERT INTO @rates
VALUES
( 'RUB', 'USD', 1, 59.3862 ),
( 'RUB', 'EUR', 1, 67.8072 ),
( 'RUB', 'AUD', 1, 45.5908 ),
( 'RUB', 'AZN', 1, 34.8900 ),
( 'RUB', 'AMD', 100, 12.3608 ),
( 'RUB', 'BYN', 1, 30.6193 ),
( 'RUB', 'BGN', 1, 34.6477 ),
( 'RUB', 'BRL', 1, 17.9724 ),
( 'RUB', 'HUF', 100, 21.9048 ),
( 'RUB', 'KRW', 1000, 51.8596 ),
( 'RUB', 'DKK', 10, 91.1488 ),
( 'RUB', 'INR', 100, 91.6843 ),
( 'RUB', 'KZT', 100, 18.3719 ),
( 'RUB', 'CAD', 1, 45.7204 ),
( 'RUB', 'KGS', 100, 85.8331 ),
( 'RUB', 'CNY', 10, 87.5954 ),
( 'RUB', 'MDL', 10, 32.8101 ),
( 'RUB', 'RON', 1, 14.8532 ),
( 'RUB', 'TMT', 1, 16.9918 ),
( 'RUB', 'NOK', 10, 70.9224 ),
( 'RUB', 'PLN', 1, 16.0179 ),
( 'RUB', 'XDR', 1, 82.5842 ),
( 'RUB', 'SGD', 1, 43.1272 ),
( 'RUB', 'TJS', 10, 67.3695 ),
( 'RUB', 'TRY', 1, 16.8711 ),
( 'RUB', 'UZS', 1000, 15.0079 ),
( 'RUB', 'UAH', 10, 22.8058 ),
( 'RUB', 'GBP', 1, 77.1902 ),
( 'RUB', 'CZK', 10, 25.8487 ),
( 'RUB', 'SEK', 10, 70.1782 ),
( 'RUB', 'CHF', 1, 61.9768 ),
( 'RUB', 'ZAR', 10, 45.3849 ),
( 'RUB', 'JPY', 100, 53.0116 )
;
SELECT 
  [from] = rt1.[iso],
  [iso] = rt2.[iso],
  [base] = rt2.[base],
  [rate] = ( rt1.[rate] / rt1.[base] ) / rt2.[rate]
FROM
  @rates rt1
  INNER JOIN @rates rt2 ON (
        rt2.[iso_base] = rt1.[iso_base]
    AND rt2.[iso] != rt1.[iso] )
WHERE
  rt1.[iso] = 'USD'
  AND rt2.[iso] = 'EUR'
;
WITH
cte AS (
  SELECT
    [path] = CONVERT( VARCHAR(MAX), '/' + rt.[iso] + '/' ),
    [lvl] = 1,
    [init] = rt.[iso],
    rt.[iso],
    rt.[iso_base],
    rt.[base],
    rt.[rate]
  FROM
    @rates rt
  WHERE
    [iso] = 'USD'
  UNION ALL
  SELECT
    [path] = CONVERT( VARCHAR(MAX), cte.[path] + rt.[iso] + '/' ),
    [lvl] = cte.[lvl] + 1,
    cte.[init],
    rt.[iso],
    rt.[iso_base],
    rt.[base],
    [rate] = cte.[rate] / rt.[rate]
  FROM
    cte
    INNER JOIN @rates rt ON (
          rt.[iso_base] = cte.[iso_base] )
  WHERE
        cte.[path] NOT LIKE '%/' + rt.[iso] + '/%'
    AND cte.[lvl] < 4
)
SELECT
  [rn] = ROW_NUMBER() OVER ( ORDER BY [rate] DESC ),
  [path],
  [lvl],
  [from] = [init],
  [iso],
  [base],
  [rate]
FROM
  cte
WHERE
  [iso]  = 'EUR'
;
3 июл 17, 14:22    [20609066]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
[quot ElenaTomsk]
s_ustinov
пропущено...


Клиент купил себе: рома, ракушек, песо, тугриков и хочет понять, сколько на данный момент его активы стоят в той валюте, которую он выбрал как isRoot

Я об этом и говорю - реальных операций на форексе не предвидится. И для таких ситуаций вариант с валютой посредником решит проблему.
3 июл 17, 14:51    [20609218]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
Руслан Дамирович
Фиг его знает, что я тут наваял...
DECLARE @rates TABLE ( [iso_base] VARCHAR(3), [iso] VARCHAR(3), [base] FLOAT, [rate] FLOAT )


Руслан, спасибо большое, похоже, то что нужно ! А можно ли прокомментировать вот этот рекурсивный cte ? Если вам не сложно.
3 июл 17, 16:55    [20609846]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
s_ustinov,

Вот и Руслан все-таки сделал через валюту-посредника. Т.е. по всем валютам есть их цена в рублях. Но коллеги, еще раз: нет у меня цены в рублях по всем валютам и нет никакой валюты-посредника. Просто нет, есть уникальные валютные пары, которые вообще ни в чем другом могут не торговаться: тугрики/песо И все. Песо торгуется только в тугриках, а тугрики торгуются еще и в рукушках.
Поэтому цену в песо в ракушках пересчитать можно только через тугрики, а не через условные единицы.
Или я чего-то не понимаю в вашей идее к сожалению
4 июл 17, 12:04    [20611691]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
Руслан Дамирович,

Rate таки считается неправильно, ибо уменьшается с каждой итерацией, в то время как для каждой итерации должен считаться независимо от остальных.
4 июл 17, 12:27    [20611787]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
CrazyDr1v3r
Руслан Дамирович,

Rate таки считается неправильно, ибо уменьшается с каждой итерацией, в то время как для каждой итерации должен считаться независимо от остальных.

Дак там такая хутерьма, я сам не до конца понял, что сваял. Исправления велкам.
4 июл 17, 12:33    [20611818]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ElenaTomsk,
у меня одна валюта посредник для примера - заносите свои пары соответствий - и будет вам счастье. Если конечно разберетесь с тем, как правильно rate считать - я вот не смог.
4 июл 17, 12:34    [20611824]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
И да, нужны дополнительные кросс-курсы, без них возможен пересчет только второго уровня.
4 июл 17, 12:48    [20611876]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
Руслан Дамирович,

А в общем, случае, ИМХО, никак. Только отдельно по каждому уровню.
4 июл 17, 12:51    [20611896]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
ElenaTomsk
Вот и Руслан все-таки сделал через валюту-посредника. Т.е. по всем валютам есть их цена в рублях. Но коллеги, еще раз: нет у меня цены в рублях по всем валютам и нет никакой валюты-посредника. Просто нет, есть уникальные валютные пары, которые вообще ни в чем другом могут не торговаться: тугрики/песо И все. Песо торгуется только в тугриках, а тугрики торгуются еще и в рукушках.
Поэтому цену в песо в ракушках пересчитать можно только через тугрики, а не через условные единицы.
Или я чего-то не понимаю в вашей идее к сожалению

Можно сумму в песо перевести в доллары? Можно сумму в ракушках перевести в доллары?
Если можно - то доллар можно использовать как промежуточную валюту. Если нельзя - вообще нельзя решить задачу пересчитать сумму в любой валюте в валюту, которую выберет пользователь.

То, что у вас нет валюты-посредника, не значит, что её нет в принципе.
Просто у проектировщика вашей базы или имелись очень весомые причины делать именно такую структуру данных, или (что более вероятно) его уровень не достаточный для решения таких задач.
Измените структуру БД и приложения - и будет вам счастье.
4 июл 17, 12:59    [20611924]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
s_ustinov,

В том-то и вопрос, что непонятна сама идея, как это сделать. Могу поменять структуру таблицы на что угодно, понять бы, на что.
4 июл 17, 13:34    [20612090]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
Руслан Дамирович,

Я в вашем коде с трудом разбираюсь, потому что вообще про эти рекурсивные cte два дня назад узнала. Возможно, конечно, действительно будет верней пересчитывать цену в момент её заливки в базу. Но опять возвращаемся к тому, что я такое не могу сообразить, как сделать без курсора

Сейчас у меня алгоритм такой :

1. из набора пар определить пару, в которой есть валюта с признаком isRoot. Взять ее @price и @id
2. Открыть набор записей валют и начать перебор
3. Если у @idCurrent выбранной валюты idSecondary не совпадает с @id, тогда сделать выборку из набора записей валют всех записей с этой выбранной валютой. Это второй курсор.
select * from tblMain where idFirst where idFirst = @idCurrent
union 
select * from tblMain where idFirst where idSecound = @idCurrent


4. Искать в этих записях до тех пор, пока не найду запись, у которой idSecondary совпадет с @id , и собственно все посчитать

Но это даже в описании ужасно
4 июл 17, 13:54    [20612163]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
ElenaTomsk
В том-то и вопрос, что непонятна сама идея, как это сделать. Могу поменять структуру таблицы на что угодно, понять бы, на что.

Описание с курсорами было познавательным.

Выложите текущую структуру таблиц, которая имеет отношение к ценам, суммам, валютам и курсам - может, подскажу чего.
4 июл 17, 15:42    [20612640]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
В общем, у меня вышло так:

DECLARE @rates TABLE ( [iso_base] VARCHAR(3), [iso] VARCHAR(3), [base] FLOAT, [rate] FLOAT )
;
INSERT INTO @rates
VALUES
( 'JPY', 'DKK', 	1	,	0.0509	 ),
( 'JPY', 'EUR', 	1	,	0.0068	 ),
( 'JPY', 'GBP', 	1	,	0.0054	 ),
( 'JPY', 'NZD', 	1	,	0.0109	 ),
( 'JPY', 'SEK', 	1	,	0.0635	 ),
( 'JPY', 'USD', 	1	,	0.0085	 ),
( 'NZD', 'AUD', 	1	,	0.9255	 ),
( 'NZD', 'CAD', 	1	,	0.8943	 ),
( 'NZD', 'CHF', 	1	,	0.7568	 ),
( 'NZD', 'DKK', 	1	,	4.6798	 ),
( 'NZD', 'EUR', 	1	,	0.629	 ),
( 'NZD', 'GBP', 	1	,	0.5007	 ),
( 'NZD', 'JPY', 	1	,	92.412	 ),
( 'NZD', 'SEK', 	1	,	5.8448	 ),
( 'NZD', 'USD', 	1	,	0.7819	 ),
( 'SEK', 'AUD', 	1	,	0.1584	 ),
( 'SEK', 'CAD', 	1	,	0.153	 ),
( 'SEK', 'CHF', 	1	,	0.1292	 ),
( 'SEK', 'DKK', 	1	,	0.8006	 ),
( 'SEK', 'EUR', 	1	,	0.1076	 ),
( 'SEK', 'GBP', 	1	,	0.0857	 ),
( 'SEK', 'JPY', 	1	,	15.8137	 ),
( 'SEK', 'NZD', 	1	,	0.1711	 ),
( 'SEK', 'USD', 	1	,	0.1338	 ),
( 'USD', 'AUD', 	1	,	1.1836	 ),
( 'USD', 'CAD', 	1	,	1.1437	 ),
( 'USD', 'CHF', 	1	,	0.9654	 ),
( 'USD', 'DKK', 	1	,	5.9852	 ),
( 'USD', 'EUR', 	1	,	0.803	 ),
( 'USD', 'GBP', 	1	,	0.6381	 ),
( 'USD', 'JPY', 	1	,	118.189	 ),
( 'USD', 'NZD', 	1	,	1.2789	 ),
( 'USD', 'SEK', 	1	,	7.4751	 )
;

SELECT *, a.rate * b.rate * c.rate AS Result_Rate
FROM @rates a
JOIN @rates b ON a.iso = b.iso_base
JOIN @rates c ON b.iso = c.iso_base
WHERE a.iso_base = 'JPY' and c.iso = 'USD'


iso_baseisobaserateiso_baseisobaserateiso_baseisobaserateResult_Rate
JPYNZD10,0109NZDJPY192,412JPYUSD10,00850,0085619718
JPYSEK10,0635SEKJPY115,8137JPYUSD10,00850,008535444575
JPYUSD10,0085USDJPY1118,189JPYUSD10,00850,00853915525
JPYSEK10,0635SEKNZD10,1711NZDUSD10,78190,008495226215
JPYUSD10,0085USDNZD11,2789NZDUSD10,78190,008499761235
JPYNZD10,0109NZDSEK15,8448SEKUSD10,13380,008524173216
JPYUSD10,0085USDSEK17,4751SEKUSD10,13380,00850143123
4 июл 17, 15:54    [20612727]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
CrazyDr1v3r,
У вас получилась прекрасная иллюстрация возможных проблем при таком подходе - 7 разных возможных курса для пересчета.
4 июл 17, 16:04    [20612787]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
s_ustinov
CrazyDr1v3r,
У вас получилась прекрасная иллюстрация возможных проблем при таком подходе - 7 разных возможных курса для пересчета.

Можно подумать, что есть иные варианты, если нужные валютные пары напрямую не торгуются.
И кстати, если убрать имеющуюся котировку JPY/USD, то останется только две:

iso_baseisobaserateiso_baseisobaserateiso_baseisobaserateResult_Rate
JPYSEK10,0635SEKNZD10,1711NZDUSD10,78190,008495226215
JPYNZD10,0109NZDSEK15,8448SEKUSD10,13380,008524173216
4 июл 17, 16:10    [20612832]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
И выбрать из них среднее арифметическое.
4 июл 17, 16:13    [20612856]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
CrazyDr1v3r
s_ustinov
CrazyDr1v3r,
У вас получилась прекрасная иллюстрация возможных проблем при таком подходе - 7 разных возможных курса для пересчета.

Можно подумать, что есть иные варианты, если нужные валютные пары напрямую не торгуются.

Самое смешное, что такие варианты есть и об этих вариантах в этой теме написали.
То, что какие то пары напрямую не торгуются, не мешает рассчитывать курсы.
4 июл 17, 16:16    [20612867]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
s_ustinov
Самое смешное, что такие варианты есть и об этих вариантах в этой теме написали.
То, что какие то пары напрямую не торгуются, не мешает рассчитывать курсы.


Писали. Но только в русле двух пар А/Б и Б/В, но не трех - А/Б, Б/В и В/Г, к которым могут прибавиться Б/Д и Д/Г.
Тогда А/Г = (А/Б) * (Б/В) * (В/Г) или А/Г = (А/Б) * (Б/Д) * (Д/Г)
4 июл 17, 16:29    [20612931]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
CrazyDr1v3r
s_ustinov
Самое смешное, что такие варианты есть и об этих вариантах в этой теме написали.
То, что какие то пары напрямую не торгуются, не мешает рассчитывать курсы.


Писали. Но только в русле двух пар А/Б и Б/В, но не трех - А/Б, Б/В и В/Г, к которым могут прибавиться Б/Д и Д/Г.
Тогда А/Г = (А/Б) * (Б/В) * (В/Г) или А/Г = (А/Б) * (Б/Д) * (Д/Г)

Из этого всего навсего следует, что информацию о курсах в базе следует хранить в таком виде, чтобы для любых двух валют А и В была информация о курсе в виде А/Б и Б/В.
Надо структуру БД исправить, а не мега-запрос писать.

Например, в навике информация о курсах хранится вот так (часть полей убрал):

CREATE TABLE [Currency Exchange Rate](
	[timestamp] [timestamp] NOT NULL,
	[Currency Code] [nvarchar](10) NOT NULL,
	[Starting Date] [datetime] NOT NULL,
	[Exchange Rate Amount] [decimal](38, 20) NOT NULL,
	[Adjustment Exch_ Rate Amount] [decimal](38, 20) NOT NULL,
	[Relational Currency Code] [nvarchar](10) NOT NULL,
	[Relational Exch_ Rate Amount] [decimal](38, 20) NOT NULL,
	[Fix Exchange Rate Amount] [int] NOT NULL,
	[Relational Adjmt Exch Rate Amt] [decimal](38, 20) NOT NULL,
 CONSTRAINT [Currency Exchange Rate$0] PRIMARY KEY CLUSTERED 
(
	[Currency Code] ASC,
	[Starting Date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Что какое поле значит описано здесь:
https://msdn.microsoft.com/en-us/library/hh171003(v=nav.90).aspx
4 июл 17, 16:44    [20612997]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
CrazyDr1v3r
Guest
s_ustinov
Из этого всего навсего следует, что информацию о курсах в базе следует хранить в таком виде, чтобы для любых двух валют А и В была информация о курсе в виде А/Б и Б/В.
Надо структуру БД исправить, а не мега-запрос писать.



Еще раз. Даны две валюты А и Г. Промежуточной валюты Х для сопоставления пар А/Х и Х/Г нет. Есть А/Б, Б/В, В/Г, Б/Д, Д/Г. Как посчитать А/Г?
4 июл 17, 17:57    [20613270]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2159
CrazyDr1v3r
s_ustinov
Из этого всего навсего следует, что информацию о курсах в базе следует хранить в таком виде, чтобы для любых двух валют А и В была информация о курсе в виде А/Б и Б/В.
Надо структуру БД исправить, а не мега-запрос писать.



Еще раз. Даны две валюты А и Г. Промежуточной валюты Х для сопоставления пар А/Х и Х/Г нет. Есть А/Б, Б/В, В/Г, Б/Д, Д/Г. Как посчитать А/Г?

Вы издеваетесь?
Выбрать из валют А Б В Г Д любую и назначить её "промежуточной".
На основании информации о курсах А/Б, Б/В, В/Г, Б/Д, Д/Г рассчитать курс каждой из валют к "промежуточной валюте". Рассчитать любым способом, хоть вручную на калькуляторе, и загружать в базу курсы к "промежуточной валюте".
В результате у вас ЕСТЬ промежуточная валюта и курс.
4 июл 17, 18:05    [20613303]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
aleks2
Guest
Да, страдальцы, так вы и не осознали тривиальной истины: MS SQL не считалочка, MS SQL - хранилище данных.

Надо один раз БЫСТРО сосчитать. И сто лет пользовать.

DECLARE @rates TABLE ( [iso_base] CHAR(3), [iso] CHAR(3), [rate] FLOAT not null, orig bit default 1, primary key ([iso_base], [iso]), unique([iso], [iso_base]) );
;
INSERT INTO @rates([iso_base], [iso], [rate])
VALUES
( 'JPY', 'DKK', 	0.0509	 ),
( 'JPY', 'EUR', 	0.0068	 ),
( 'JPY', 'GBP', 	0.0054	 ),
( 'JPY', 'NZD', 	0.0109	 ),
( 'JPY', 'SEK', 	0.0635	 ),
( 'JPY', 'USD', 	0.0085	 ),
( 'NZD', 'AUD', 	0.9255	 ),
( 'NZD', 'CAD', 	0.8943	 ),
( 'NZD', 'CHF', 	0.7568	 ),
( 'NZD', 'DKK', 	4.6798	 ),
( 'NZD', 'EUR', 	0.629	 ),
( 'NZD', 'GBP', 	0.5007	 ),
( 'NZD', 'JPY', 	92.412	 ),
( 'NZD', 'SEK', 	5.8448	 ),
( 'NZD', 'USD', 	0.7819	 ),
( 'SEK', 'AUD', 	0.1584	 ),
( 'SEK', 'CAD', 	0.153	 ),
( 'SEK', 'CHF', 	0.1292	 ),
( 'SEK', 'DKK', 	0.8006	 ),
( 'SEK', 'EUR', 	0.1076	 ),
( 'SEK', 'GBP', 	0.0857	 ),
( 'SEK', 'JPY', 	15.8137	 ),
( 'SEK', 'NZD', 	0.1711	 ),
( 'SEK', 'USD', 	0.1338	 ),
( 'USD', 'AUD', 	1.1836	 ),
( 'USD', 'CAD', 	1.1437	 ),
( 'USD', 'CHF', 	0.9654	 ),
( 'USD', 'DKK', 	5.9852	 ),
( 'USD', 'EUR', 	0.803	 ),
( 'USD', 'GBP', 	0.6381	 ),
( 'USD', 'JPY', 	118.189	 ),
( 'USD', 'NZD', 	1.2789	 ),
( 'USD', 'SEK', 	7.4751	 )
;

declare @rc int =1;

while @rc > 0 begin

  with r as ( select * from @rates )
     , nr as ( select r1.iso_base, r2.iso, rate = ( r1.rate * r2.rate ) from r as r1 inner join r as r2 on r1.iso = r2.iso_base )
	 , rr as ( select iso_base, iso, rate = max(rate), orig = 0 from nr
	             where not exists( select * from r where r.iso_base = nr.iso_base and r.iso = nr.iso )
				 group by iso_base, iso
			
	         )
	insert r select * from rr;
  set @rc = @@ROWCOUNT;

  with r as ( select * from @rates )
     , nr as ( select iso_base = r1.iso, iso = r2.iso_base, rate = (1./r1.rate) * (1./r2.rate) from  r as r1 inner join r as r2 on r1.iso_base = r2.iso )
	 , rr as ( select iso_base, iso, rate = max(rate), orig = 0  from nr
	             where not exists( select * from r where r.iso_base = nr.iso_base and r.iso = nr.iso )
				 group by iso_base, iso
	         )
	insert r select * from rr;
  set @rc = @rc +@@ROWCOUNT;

end;


-- ВСЕ кросс-курсы. С кратчайшим путем и максимальные.
select * from @rates;
4 июл 17, 18:45    [20613427]     Ответить | Цитировать Сообщить модератору
 Re: Расчет валютных пар в один select?  [new]
Adx
Guest
ElenaTomsk
s_ustinov,

Но коллеги, еще раз: нет у меня цены в рублях по всем валютам и нет никакой валюты-посредника. Просто нет, есть уникальные валютные пары, которые вообще ни в чем другом могут не торговаться: тугрики/песо И все. Песо торгуется только в тугриках, а тугрики торгуются еще и в рукушках.
Поэтому цену в песо в ракушках пересчитать можно только через тугрики, а не через условные единицы.
Или я чего-то не понимаю в вашей идее к сожалению


Елена, если не секрет, приведите пример валюты, у которой нет курса к доллару?
4 июл 17, 20:07    [20613571]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить