查看: 5862|回复: 16

[SQL] 【大话IT】数据递归汇总

[复制链接]
认证徽章
论坛徽章:
31
阿斯顿马丁
日期:2014-01-19 12:48:30秀才
日期:2015-09-21 09:46:16秀才
日期:2015-10-26 09:55:08秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-12 11:23:27秀才
日期:2016-01-25 15:02:042016猴年福章
日期:2016-02-23 09:58:34秀才
日期:2016-04-21 14:08:53白羊座
日期:2016-05-30 14:22:00秀才
日期:2016-06-23 14:15:06
发表于 2015-3-3 15:52 | 显示全部楼层 |阅读模式
eg:id,父类id,金额,现在要将子类id的金额汇总到父类id的金额里面去,是递归的,生成新的表数据,如何实现,求教。
ID                                     money            PID
AGE000002100120                72786.1                AGE000002100081
AGE000002100166                237                       AGE000002100081
AGE000002100167                11305.3                AGE000002100081
AGE000002100185                10105                  AGE000002100170
AGE000002100122                84922                  AGE000002100081
AGE000002100126                25240.71             AGE000002100081
AGE000002100172                54123.5                AGE000002100081
AGE000002100170                13095                  AGE000002100081
AGE000002100142                2908                      AGE000002100081
AGE000002100164                31176            AGE000002100081
AGE000002100081             112333   

论坛徽章:
6
2010广州亚运会纪念徽章:板球
日期:2010-11-15 11:29:572010广州亚运会纪念徽章:足球
日期:2010-11-15 11:30:022013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-20 06:00:12沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-3-3 16:32 | 显示全部楼层
你想要的结果是什么样的?

使用道具 举报

回复
认证徽章
论坛徽章:
31
阿斯顿马丁
日期:2014-01-19 12:48:30秀才
日期:2015-09-21 09:46:16秀才
日期:2015-10-26 09:55:08秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-12 11:23:27秀才
日期:2016-01-25 15:02:042016猴年福章
日期:2016-02-23 09:58:34秀才
日期:2016-04-21 14:08:53白羊座
日期:2016-05-30 14:22:00秀才
日期:2016-06-23 14:15:06
发表于 2015-3-3 16:36 | 显示全部楼层
abstractcyj 发表于 2015-3-3 16:32
你想要的结果是什么样的?

ID不变,金额进行汇总
            ID                         money                    PID
AGE000002100120                72786.1                AGE000002100081
AGE000002100166                237                     AGE000002100081
AGE000002100167                11305.3                AGE000002100081
AGE000002100185                10105                  AGE000002100170
AGE000002100122                84922                  AGE000002100081
AGE000002100126                25240.71               AGE000002100081
AGE000002100172                54123.5                AGE000002100081
AGE000002100170                10105+13095         AGE000002100081
AGE000002100142                2908                   AGE000002100081
AGE000002100164                31176            AGE000002100081
AGE000002100081   112333+72786.1+237 ...

使用道具 举报

回复
论坛徽章:
6
2010广州亚运会纪念徽章:板球
日期:2010-11-15 11:29:572010广州亚运会纪念徽章:足球
日期:2010-11-15 11:30:022013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-20 06:00:12沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-3-3 16:44 | 显示全部楼层
zlingyi 发表于 2015-3-3 16:36
ID不变,金额进行汇总
            ID                         money                    PID
AGE0000 ...

select id, (select sum(t.amt) from p t start with t.id = a.id connect by prior t.id = t.pid), pid from p a

效率会比较糟糕

使用道具 举报

回复
论坛徽章:
127
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-3-3 16:45 | 显示全部楼层
本帖最后由 bell6248 于 2015-3-3 16:46 编辑



具体如下:


SQL> with t as
  2  (
  3   select 'AGE000002100120' id, 72786.1 money, 'AGE000002100081' pid from dual
  4   union all
  5   select 'AGE000002100166' id, 237 money, 'AGE000002100081' pid from dual
  6   union all
  7   select 'AGE000002100167' id, 11305.3 money, 'AGE000002100081' pid from dual
  8   union all
  9   select 'AGE000002100185' id, 10105 money, 'AGE000002100170' pid from dual
10   union all
11   select 'AGE000002100122' id, 84922 money, 'AGE000002100081' pid from dual
12   union all
13   select 'AGE000002100126' id, 25240.71 money, 'AGE000002100081' pid from dual
14   union all
15   select 'AGE000002100172' id, 54123.5 money, 'AGE000002100081' pid from dual
16   union all
17   select 'AGE000002100170' id, 13095 money, 'AGE000002100081' pid from dual
18   union all
19   select 'AGE000002100142' id, 2908 money, 'AGE000002100081' pid from dual
20   union all
21   select 'AGE000002100164' id, 31176 money, 'AGE000002100081' pid from dual
22   union all
23   select 'AGE000002100081' id, 112333 money, null pid from dual
24  )
25  select id,
26         pid,
27         money,
28         dbms_aw.eval_number(ltrim(sys_connect_by_path(money, '+'), '+')) new_money
29    from t
30   start with pid is null
31   connect by prior id = pid
32  /

ID              PID                  MONEY  NEW_MONEY
--------------- --------------- ---------- ----------
AGE000002100081                     112333     112333
AGE000002100120 AGE000002100081    72786.1   185119.1
AGE000002100122 AGE000002100081      84922     197255
AGE000002100126 AGE000002100081   25240.71  137573.71
AGE000002100142 AGE000002100081       2908     115241
AGE000002100164 AGE000002100081      31176     143509
AGE000002100166 AGE000002100081        237     112570
AGE000002100167 AGE000002100081    11305.3   123638.3
AGE000002100170 AGE000002100081      13095     125428
AGE000002100185 AGE000002100170      10105     135533
AGE000002100172 AGE000002100081    54123.5   166456.5

11 rows selected

SQL>




使用道具 举报

回复
论坛徽章:
6
2010广州亚运会纪念徽章:板球
日期:2010-11-15 11:29:572010广州亚运会纪念徽章:足球
日期:2010-11-15 11:30:022013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2013-12-20 06:00:12沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2015-3-3 16:47 | 显示全部楼层
bell6248 发表于 2015-3-3 16:45
具体如下:


学习了

使用道具 举报

回复
论坛徽章:
127
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-3-3 16:50 | 显示全部楼层
本帖最后由 bell6248 于 2015-3-3 16:58 编辑
abstractcyj 发表于 2015-3-3 16:47
学习了

我给的结果是从上往下的,看了一下,#4楼的方法即可得到LZ的需求

使用道具 举报

回复
认证徽章
论坛徽章:
31
阿斯顿马丁
日期:2014-01-19 12:48:30秀才
日期:2015-09-21 09:46:16秀才
日期:2015-10-26 09:55:08秀才
日期:2015-12-25 15:31:10秀才
日期:2016-01-12 11:23:27秀才
日期:2016-01-25 15:02:042016猴年福章
日期:2016-02-23 09:58:34秀才
日期:2016-04-21 14:08:53白羊座
日期:2016-05-30 14:22:00秀才
日期:2016-06-23 14:15:06
发表于 2015-3-3 17:06 | 显示全部楼层
abstractcyj 发表于 2015-3-3 16:44
select id, (select sum(t.amt) from p t start with t.id = a.id connect by prior t.id = t.pid), pid  ...

可以使用,谢谢!学习了

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2015-3-3 21:20 | 显示全部楼层
abstractcyj 发表于 2015-3-3 16:44
select id, (select sum(t.amt) from p t start with t.id = a.id connect by prior t.id = t.pid), pid  ...

这个算标量子查询?

使用道具 举报

回复
论坛徽章:
2
喜羊羊
日期:2015-03-04 14:52:462015年新春福章
日期:2015-03-06 11:58:18
发表于 2015-3-3 21:32 | 显示全部楼层
zlingyi 发表于 2015-3-3 17:06
可以使用,谢谢!学习了

感觉加上START WITH 比较靠谱,是所有树遍历还是就遍历 pid is null 的

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表