表A(id char(10), freedate char(8)),表B(id char(10), optdate char(8), sum decimal(10,2)),表A的id是主键,表B是纵表,一个id会对应多条记录。 
现在想让B外连接A,得到B中B.optdate <A.freedate and B.id=A.id的最大日期对应的sum的值。 
例如: A中记录(1, '20091001') B 中记录(1,'20091021',100) (1, '20090801', 200) (1, '20090901', 300) 
想写一个如下所示的sql: 
select A.* from A left outer join ( ..... ) b on b.id = a.id 
因为B.optdate <A.freedate有两条记录,取这两条记录中optdate最大值的记录的sum,即300,得到结果: 
A.id  A.freedate  B.sum 
1    20090901    300 不知道说明白没有, 折腾半天也写不出来,谢谢大家了。

解决方案 »

  1.   

    with a as
    (select 1 id, '20090921' freedate from dual),
     b as 
    (select 1 id,'20091001' optdate,100 sums from dual
    union all 
    select 1,'20090901',200 from dual
    union all 
    select 1,'20090801',200 from dual)
    select a.id,sum(sums) from a,b
    where a.id=b.id
    and a.freedate>b.optdate
    group by a.id
    结果
    ID SUM(SUMS)
    1 400
      

  2.   

    SELECT A.ID,A.FREEDATE,MAX(B.SUM)
    FROM B,A
    WHERE (B.OPTDATE < A.FREEDATE) AND (A.ID=B.ID)
    GROUP BY (A.ID,A.FREEDATE)
      

  3.   

    select A.*,SUM(B.sum) from A,B
    where A.id=B.id and 
    B.optdate <A.freedate 
    感觉没什么啊?要不我理解错了?
      

  4.   

    我上面那个不对。
    SELECT A.ID,A.FREEDATE,T.C_SUM
    FROM A,(
    SELECT A.ID ID,MAX(B.SUM) C_SUM
    FROM B,A
    WHERE (B.OPTDATE < A.FREEDATE) AND (A.ID=B.ID)
    GROUP BY (A.ID)
    )T
    WHERE A.ID = T.ID
      

  5.   

    因为B.optdate <A.freedate有两条记录,取这两条记录中optdate最大值的记录的sum,即300不是 还是不理解 首先我写的是错的`
     
    可是你的这个 既然是最大记录 不就是一条吗 你的列子上也是的 是一条还要SUM干什么呢?
      

  6.   

    我想用left join这种方式实现,A和B能关联上的,返回sum, 关联不上的返回null。
    整个sql应该以A为主表,B外连接A得到sum的值。
    sql得到的记录条数应该和A是一样的,
      

  7.   

    我这里的sum是字段名字,不是说把一组id的sum字段求和。
      

  8.   

    这就差不多了,改成外连接就好
    WHERE (B.OPTDATE(+) < A.FREEDATE) AND (A.ID=B.ID(+))或者
    select a.id,a.freedate,
      (select max(b.sum) from b where id=a.id and optdate<a.freedate)sum
    from a
      

  9.   

    SELECT A.ID,A.FREEDATE,NVL(T.C_SUM,0)
    FROM A LEFT JOIN(
    SELECT A.ID ID,MAX(B.SUM) C_SUM
    FROM B,A
    WHERE (B.OPTDATE < A.FREEDATE) AND (A.ID=B.ID)
    GROUP BY (A.ID)
    )T
    ON A.ID = T.ID
      

  10.   

    SELECT A.ID,A.FREEDATE,MAX(B.SUM) 
    FROM A LEFT JOIN B
    ON A。ID =B。ID 
    WHERE (B.OPTDATE < A.FREEDATE)
    GROUP BY (A.ID,A.FREEDATE)