表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 不知道说明白没有, 折腾半天也写不出来,谢谢大家了。
现在想让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 不知道说明白没有, 折腾半天也写不出来,谢谢大家了。
解决方案 »
- Oracle创建一个表 如果不指定表空间 是不是就是用默认的system表空间
- oracle想通过字段信息查到相关的表
- 请问ORDER BY ASC 和ORDER BY 1 有什么区别?
- 在线等,马上结贴:在oracle中的PLSQL程序里把表的数据 导出 成为csv文件
- oralce 大数据量
- 在程序中如何判断Oracle 的Listen是否启动?
- Oracle安装目录下\NET80\ADMIN\的TNSNAMES.ORA文件有什么作用?
- 高分求解!(jsp中怎样保存图片文件到oracle数据库,求原代码)!!
- 请教:如何一次性备份/恢复数据库中所有存储过程
- 关于数据库链接(database link)的两个问题
- 奇怪的索引问题
- +号除了表示外连接之外,还有别的用法么?
(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
FROM B,A
WHERE (B.OPTDATE < A.FREEDATE) AND (A.ID=B.ID)
GROUP BY (A.ID,A.FREEDATE)
where A.id=B.id and
B.optdate <A.freedate
感觉没什么啊?要不我理解错了?
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
可是你的这个 既然是最大记录 不就是一条吗 你的列子上也是的 是一条还要SUM干什么呢?
整个sql应该以A为主表,B外连接A得到sum的值。
sql得到的记录条数应该和A是一样的,
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
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
FROM A LEFT JOIN B
ON A。ID =B。ID
WHERE (B.OPTDATE < A.FREEDATE)
GROUP BY (A.ID,A.FREEDATE)