oracle 一对多中的最大值
现在又两张表:基本表A(客户名称,产品名称,金额,数量,币种主键,票据日期)
汇率表B(币种主键,币种名称,汇率,汇率更新日期)这个汇率就是币种主键对应的币种对人民币的汇率
现在要得到一张表,
客户,产品名称,金额(人民币),数量
瓶颈在是,取汇率表中的汇率时,一个币种会有多种汇率(7月的,8月的都有),所以我要通过票据日期去找币种相同,离票据日期最近的,但小于票据期的那个汇率。
答案:SELECT a.客户名称,a.产品名称,a.金额 * b.汇率 ,a数量
FROM a,
b
WHERE a.币种主键 = b.币种主键
AND b.汇率更新日期 = (SELECT MAX(c.汇率更新日期)
FROM b c
WHERE c.币种主键 = a.币种主键
AND c.汇率更新日期 < a.票据日期)
其他:select 客户名称, 产品名称, 金额*b.汇率 as 金额, 数量
from A, B
where a.币种主键 = b.币种主键
and b.汇率更新日期 < a.票据日期
and not exists ( select 1 from b b1 where b1.汇率更新日期 < a.票据日期 and b1.汇率更新日期 > b.汇率更新日期 and b1.币种主键 = a.币种主键)
not exists控制,不存在小于A表的票据日期而且比当前的汇率更新日期最大的记录,就说明当前的汇率更新日期是最接近A表票据日期的一个日期了。
另外,还可以取小于票据日期的最大汇率更新日期
select 客户名称, 产品名称, 金额*b.汇率 as 金额, 数量
from A, B
where a.币种主键 = b.币种主键
and b.汇率更新日期 = (
select max(汇率更新日期)
from B b1 where b1.汇率更新日期 < a.票据日期
and b1.币种主键 = b.币种主键
)
上一个:在oracle数据库表中没有添加rowid字段为什么会出现
下一个:oracle创建完索引删不掉。