|
|
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
есть таблица с затратами в разных валютах: zatr (дата, код валюты, сумма) Код: plaintext 1. 2. 3. 4. 5. 6. 7. курсы валют вводятся на дату изменения, т.е. Код: plaintext 1. 2. 3. нужно привести все затраты к одной валюте (например USD) , с учетом курса на дату затрат можно ли сделать это одним запросом, без ХП ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 14:31 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
варианты 1. хранить дату окончания действия курса 2. Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 15:24 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Naf, велик и могуч SQL спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 16:18 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
все хорошо, но в этот запрос еще бы курс USD вытянуть, чтобы rubsumma в USD перевести Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 16:26 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
vill_ager, не правильно ты усд подтянул. Его подтягивать надо сразу в подзапросе. чтобы иметь сумму в усд на КАЖДУЮ дату платежа. А не один раз в конце! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 16:34 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
vill_agerвсе хорошо, но в этот запрос еще бы курс USD вытянуть, чтобы rubsumma в USD перевести аналогично мне больше вариант 1 нравится (хранить дату окончания действия курса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 17:16 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Nafмне больше вариант 1 нравится (хранить дату окончания действия курса) тогда каждый день придется корректировать дату а так ввел и забыл до следующего изменения Nafаналогично :) легко сказать, у меня не получается может потому, что курсы разных валют могут меняться в разные дни если уточнить задачу - нужно получить кросс-курс к USD на дату каждой операции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 18:37 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
vill_agerтогда каждый день придется корректировать дату а так ввел и забыл до следующего изменения А кто Вам мешает задать эту дату следующего изменения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2011, 16:19 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Konstantin Permyakov, дата следующего изменения - по результатам торгов изменения может и не быть а если бы я знал результаты следующих торгов, то не шарился бы на этом форуме... :) а запрос получился такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. код USD-3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2011, 21:39 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Я бы еще посоветовал не лезть за курсом к каждой записи... Найдите сразу курсы всех валют на сегодняшнее число и работайте с ними. Иначе при большом количестве строк в таблице затрат ваш запрос умрет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 11:07 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Обшибся, не усмотрел историю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 11:10 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Skoffer, так и есть, работает долго в гонках победил вариант с обычным циклом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 11:33 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Хотел бы отметить еще что в первом запросе Naf, есть ошибка. Группируя по дате,валюте и сумме вы отсекаете все платежи в одной валюте за день c такой же суммой. Т.е. если в zatr есть такие строчки 02/01/2011 USD 3000 02/01/2011 USD 3000 То внутренний подзапрос: SELECT zatr.dt, zatr.val, zatr.summ, MAX(valcurs.dt) AS maxdt FROM zatr LEFT JOIN valcurs ON(zatr.val = valcurs.val AND zatr.dt >= valcurs.dt) GROUP BY zatr.dt, zatr.val, zatr.summ Вернет: 02/01/2011 USD 3000, maxdt. Не знаю есть в ли MYSQL скалярные подзапросы, а в Oracle я бы сделал так: SELECT a.dt, a.val, a.summ, b.curs FROM (SELECT zatr.dt, zatr.val, zatr.summ, (SELECT MAX( valcurs.dt ) FROM valcurs WHERE valcurs.dt <= zatr.dt) as maxdt FROM zatr) a, valcurs b WHERE a.maxdt=b.dt and a.val=b.val; И добавил бы индекс на дату в обоих таблицах. В таком случае оптимизатор будет искать max как FIRST ROWS INDEX RANGE SCAN MIN/MAX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 13:30 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
Но третий запрос Nafa все равно круче всего как оказалось ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 13:34 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
SELECT valcurs1.dt AS begindt, nvl(MIN(valcurs2.dt), to_date('01.01.9999', 'dd.mm.yyyy')) AS enddt, valcurs1.val, valcurs1.curs FROM valcurs valcurs1 LEFT JOIN valcurs valcurs2 ON valcurs1.val = valcurs2.val AND valcurs1.dt < valcurs2.dt GROUP BY valcurs1.dt, valcurs1.val, valcurs1.curs Вернет 01.01.11,"01.01.99","EUR","45" 01.01.11,"02.01.11","USD","35" 02.01.11,"04.01.11","USD","31" 04.01.11,"01.01.99","USD","30" а джоин zatr'a с ним даст дубляжи из за перечения интервалов 01.01.11,"02.01.11","USD","35" 02.01.11,"04.01.11","USD","31" Додумываем дальше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 14:03 |
|
||
|
SQL запрос - конвертация затрат в разных валютах в USD
|
|||
|---|---|---|---|
|
#18+
select zatr.date, zatr.val, zatr.summa, zatr.summa*T.curs as rubsumma from zatr left join (select valcurs1.date as begindate, coalesce(min(valcurs2.date),дата_армагедона) as enddate, valcurs1.val, valcurs1.curs from valcurs as valcurs1 left join valcurs as valcurs2 on valcurs1.val=valcurs2.val and valcurs1.date<valcurs2.date group by valcurs1.date, valcurs1.val, valcurs1.curs) asT on (zatr.date between T.begindate and T.enddate ) and (zatr.val=T.val) заменить на on (zatr.date >= t.begindate and <t.enddate) and (zatr.val=T.val) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2011, 14:05 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37204630&tid=1542223]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
426ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 797ms |

| 0 / 0 |
