大家看看这个sql咋写啊

lw8123 2009-11-09 02:02:15
表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

不知道说明白没有, 折腾半天也写不出来,谢谢大家了。
...全文
87 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oraclemch 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wildwave 的回复:]
引用 2 楼 duqiangcise 的回复:
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)

这就差不多了,改成外连接就好
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
[/Quote]

恩,正解,这个说的好!
ruixindongdong 2009-11-09
  • 打赏
  • 举报
回复
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)
duqiangcise 2009-11-09
  • 打赏
  • 举报
回复
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
小灰狼W 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 duqiangcise 的回复:]
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)
[/Quote]
这就差不多了,改成外连接就好
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
lw8123 2009-11-09
  • 打赏
  • 举报
回复
我这里的sum是字段名字,不是说把一组id的sum字段求和。
zjtponder 2009-11-09
  • 打赏
  • 举报
回复
不必用outer join 啊
lw8123 2009-11-09
  • 打赏
  • 举报
回复
我想用left join这种方式实现,A和B能关联上的,返回sum, 关联不上的返回null。
整个sql应该以A为主表,B外连接A得到sum的值。
sql得到的记录条数应该和A是一样的,
ruixindongdong 2009-11-09
  • 打赏
  • 举报
回复
因为B.optdate <A.freedate有两条记录,取这两条记录中optdate最大值的记录的sum,即300

不是 还是不理解 首先我写的是错的`

可是你的这个 既然是最大记录 不就是一条吗 你的列子上也是的 是一条还要SUM干什么呢?
duqiangcise 2009-11-09
  • 打赏
  • 举报
回复
我上面那个不对。
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
ruixindongdong 2009-11-09
  • 打赏
  • 举报
回复
select A.*,SUM(B.sum) from A,B
where A.id=B.id and
B.optdate <A.freedate
感觉没什么啊?要不我理解错了?
duqiangcise 2009-11-09
  • 打赏
  • 举报
回复
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)
iqlife 2009-11-09
  • 打赏
  • 举报
回复
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

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧