SQL问题,是否必须用递归

jetcat 2007-03-01 07:18:43
表A:
ID DATE MONEY
-------------------
01 20061201 100
01 20070101 200
01 20070201 300
02 20061201 400
02 20070101 500
02 20070201 600

怎么用一个SQL实现如下的结果
结果:
ID MONTHS(2006/12后的月数) MONEY
--------------------------------------
01 01 100
01 02 200+100=300
01 03 300+200+100=600
02 01 400
02 02 500+400=900
02 03 600+500+400=1500

目前就想到用程序递归实现。
能用一个SQL语句实现吗?
...全文
333 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jetcat 2007-03-07
  • 打赏
  • 举报
回复
谢谢各位的关注和帮助。
公布一下我的做法吧。
SELECT
BB.ID,
MONTHS_BETWEEN(BB.DATE,TO_DATE('20061201','YYYYMMDD')),
SUM(AA.MONEY)
FROM
表A AA,表A BB
WHERE
AA.ID=BB.ID
AND AA.DATE<=BB.DATE
GROUP BY
BB.ID,
MONTHS_BETWEEN(BB.DATE,TO_DATE('20061201','YYYYMMDD'))
小李木耳 2007-03-06
  • 打赏
  • 举报
回复
回答一下我的思路,不是递归的。
1、就是先把数据分组排序成如下的数据:
表A:
ID DATE MONEY 序号
-----------------------------
01 20061201 100 1
01 20070101 200 2
01 20070201 300 3
02 20061201 400 1
02 20070101 500 2
02 20070201 600 3

2、把1的数据进行2个表(a,b)自连结,
1)判断ID相同 and 序号相同 :只取a.MONEY
2)判断ID相同 and 序号数作为加数的个数,
如2就2个数相加 :取1)+b.MONEY;
如3就3个数相加:取1)+b.MONEY+..

不过上面的想法实现的话比较麻烦的!
小李木耳 2007-03-06
  • 打赏
  • 举报
回复
楼主的意思是:
select a.ID,
case a.ID=b.ID and a.DATE=b.DATE then
sum(a.MONEY)
case a.ID=b.ID and a.DATE<>b.DATE then
a.MONEY+ b.MONEY=sum(a.MONEY+ b.MONEY)
.....
end
from a,b
where
a.ID=b.ID(+)
and a.DATE>2006/12
group by a.ID ....

----------------
如果是这样,可能要嵌套好几层;建议千万别用sql完成,到后台处理吧,否则搞死人的!

只提建议,请别给我分,谢谢。
吐司vivi 2007-03-06
  • 打赏
  • 举报
回复
忘记说了 to_char(to_date('20061201','yyyyMMdd'),'mm') 把数字换成字段名称date
吐司vivi 2007-03-06
  • 打赏
  • 举报
回复
select id,to_char(to_date('20061201','yyyyMMdd'),'mm') mm,sum(money) from a
group by to_char(to_date('20061201','yyyyMMdd'),'mm') 试试看
jetcat 2007-03-06
  • 打赏
  • 举报
回复
谢谢manyroads兄。
可能我的要求没有写清楚,我求合计是要日期比较的,比如ID01,DATE20070101需要把01的小于20070101的money合计起来。
用partition by 好像不行。
我想到了自联结,好像可以实现。
所以只能给一半的分了。

manyroads 2007-03-05
  • 打赏
  • 举报
回复
可以啊
select id,Months_between(month, to_date('20061201','yyyyMMdd')) as MONTHS, sum(money) over (partition by id order by id, month ) as money from a

date是oracle的类型,不能作为字段
如果month作为varchar2类型,则用to_date转换一下

17,086

社区成员

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

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