2016-04-20 2 views
-2

Ниже двух таблиц у меня есть данные образца. Таблица A содержит курс доллара США (в индийскую рупию) в год, а в Таблице B содержится количество в год. Я хочу конвертировать доллар в рупию в год.Соедините две таблицы с условием меньше или равно в соединении

Table A 
Rate Year 
47 2001 
49 2003 
55 2004 

Table B 
Amt Year 
25$ 2001 
34$ 2002 

Вопрос: для первой записи (год 2001) мы имеем запись в обеих таблицах, так что мы можем сделать это легко, используя ниже запроса

sel A.Rate * B.Amt 
from A, 
    B 
where B.year = A.year 

Но для второй записи (т.е. 2002 года) мы делаем не иметь записи в таблице A (которая является таблицей тарифов), поэтому для подобных случаев я хочу использовать значение курса за предыдущий год (то есть: 47 рупий с 2001 года).

+0

Oracle или MySQL? – Aleksej

+0

@Aleksej: Mysql –

+1

В следующий раз отметьте тегом! Теперь Кристиан Палмер потратил много времени и сил, написав ответ Oracle. – jarlh

ответ

0

Oracle: используйте аналитическую функцию LEAD, чтобы вы может выработать срок действия каждой ставки.

documentation for LEAD

Это мой код:

SELECT 
trx.* 
,rates.rate_start_date 
,rates.rate_end_date 
,rates.rate 
,trx.amount * rates.rate  rup_amount 
FROM 
xxcjp_forex_trx  trx 
--this inline view works out the validity period of each rate by ordering all 
--the rates and working out the start date of the next row. It uses analytic 
--function LEAD 
,(SELECT 
    xfr.rate_date   rate_start_date 
    ,xfr.rate 
    ,xfr.currency 
    ,(LEAD(xfr.rate_date) OVER (ORDER BY xfr.currency, xfr.rate_date))-1 rate_end_date 
    FROM 
    xxcjp_forex_rates  xfr 
)  rates 
WHERE 1=1 
AND trx.trx_date BETWEEN rates.rate_start_date AND rates.rate_end_date 
AND rates.currency = 'RUP' 
ORDER BY 
trx.trx_date 
; 

На основе этих данных:

CREATE TABLE XXCJP_FOREX_RATES 
(rate_date  DATE 
,currency   VARCHAR2(20) 
,rate    NUMBER 
) 
; 


CREATE TABLE XXCJP_FOREX_TRX 
(trx_date   DATE 
,currency   VARCHAR2(20) 
,amount   NUMBER 
) 
; 

INSERT INTO XXCJP_FOREX_RATES VALUES (TO_DATE('01/03/2016','DD/MM/YYYY'),'RUP',47) ; 
INSERT INTO XXCJP_FOREX_RATES VALUES (TO_DATE('03/03/2016','DD/MM/YYYY'),'RUP',49) ; 
INSERT INTO XXCJP_FOREX_RATES VALUES (TO_DATE('10/03/2016','DD/MM/YYYY'),'RUP',55) ; 

INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('01/03/2016','DD/MM/YYYY'),'USD',10) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('02/03/2016','DD/MM/YYYY'),'USD',20) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('03/03/2016','DD/MM/YYYY'),'USD',30) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('04/03/2016','DD/MM/YYYY'),'USD',40) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('05/03/2016','DD/MM/YYYY'),'USD',50) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('06/03/2016','DD/MM/YYYY'),'USD',60) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('07/03/2016','DD/MM/YYYY'),'USD',70) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('08/03/2016','DD/MM/YYYY'),'USD',80) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('09/03/2016','DD/MM/YYYY'),'USD',90) ; 
INSERT INTO XXCJP_FOREX_TRX VALUES (TO_DATE('10/03/2016','DD/MM/YYYY'),'USD',100) ; 
+0

Отличный ответ, слишком плохой ОП использует MySQL, который afaik не поддерживает LEAD. (Довольно раздражает, когда помечены неправильные продукты.) – jarlh

1

Вот решение:

select A.rate*B.amt 
from A,B 
where B.Year = (select max(year) from B where B.year <= A.year); 
Смежные вопросы