当前位置:数据库 > Oracle >>

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创建完索引删不掉。

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,