Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Найти последнюю имеющуюся запись  [new]
Slant-shadow
Member

Откуда:
Сообщений: 274
Всем привет.
Можете помочь написать запрос выводящий дату платежа, сумму затраченных средств в рублях, учесть
что в таблице курсов может не быть записи на дату платежа.Тогда взять курс на последнюю имеющуюся запись.

Таблица покупок с указанием суммы валют t_pays
id date curr_id sum_qty
1 2011-04-04 1 5
2 2011-04-05 2 10
3 2011-04-06 3 20

таблица курсов валют по отношению к рублю t_course
id cur_id date curs
1 1 2011-04-04 1
2 2 2011-04-04 30
3 3 2011-04-04 40
4 1 2011-04-05 1
5 2 2011-04-05 30
6 3 2011-04-05 41
7 2 2011-06-06 28

таблица названий валют t_curr_name
id name
1 rur
2 usd
3 eur
17 янв 16, 15:17    [18691684]     Ответить | Цитировать Сообщить модератору
 Re: Найти последнюю имеющуюся запись  [new]
ora601
Member

Откуда:
Сообщений: 750
Slant-shadow,
Для курса, если нет записи, используй :
last_value(curs) over (partition by cur_id order by date ignore nulls)


Получиться что то вроде :

SELECT NVL(t1.date, t2.date) date, NVL(t1.curs, last_value(t1.curs) over (partition by t1.cur_id order by t1.date ignore nulls))*sum_qty "sum" 
FROM t_course  t1 RIGHT JOIN t_pays t2 on t1.date=t2.date
WHERE date = :date
17 янв 16, 15:57    [18691778]     Ответить | Цитировать Сообщить модератору
 Re: Найти последнюю имеющуюся запись  [new]
Slant-shadow
Member

Откуда:
Сообщений: 274
А почему вы по дате таблицы соединяете?
17 янв 16, 20:52    [18692551]     Ответить | Цитировать Сообщить модератору
 Re: Найти последнюю имеющуюся запись  [new]
stax..
Guest
Slant-shadow,

  1  WITH p(id, dat, curr_id, sum_qty ) as (
  2  select 1, date '2011-04-04', 1, 5 from dual union all
  3  select 2, date '2011-04-05', 2, 10 from dual union all
  4  select 3, date '2011-04-06', 3, 20 from dual )
  5  ,c (id, cur_id, dat, curs) as (
  6  select 1, 1 ,date'2011-04-04', 1  from dual union all
  7  select 2, 2 ,date'2011-04-04', 30  from dual union all
  8  select 3, 3 ,date'2011-04-04', 40  from dual union all
  9  select 4, 1 ,date'2011-04-05', 1  from dual union all
 10  select 5, 2 ,date'2011-04-05', 30  from dual union all
 11  select 6, 3 ,date'2011-04-05', 41  from dual union all
 12  select 7, 2 ,date'2011-06-06', 28  from dual )
 13  select p.id, p.dat, p.curr_id, p.sum_qty,
 14   p.sum_qty*(select max(curs) KEEP (DENSE_RANK LAST ORDER BY dat) curs
 15             from c where c.cur_id=p.curr_id and c.dat<=p.dat) sum_rur
 16*  from p
SQL> /

        ID DAT         CURR_ID    SUM_QTY    SUM_RUR
---------- -------- ---------- ---------- ----------
         1 04.04.11          1          5          5
         2 05.04.11          2         10        300
         3 06.04.11          3         20        820

SQL>


ps
мож case добавить для рур и nvl напр для тех у кого "дата есть"

.....
stax
18 янв 16, 15:59    [18696548]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить