查看: 401|回复: 5

[SQL] 叶子节点如何累计到父节点

[复制链接]
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-10 15:01:39
发表于 2020-1-13 15:58 | 显示全部楼层 |阅读模式
现在有一个不对称的分类树, 另外一个系统提供了所有叶子节点的数据。我这边需要计算出完整树的值。
例子:
提供的值:
a
7230
b
3265
c
1877
c1
3633
d1
6863
d2
4083
d3
8418
d4
9982
d5
2865
如表格所示: 树形结构是已知不变的, 父节点是前位的值, 其中 C1是C的某个一部分, 所以提供的C和C1是互斥, C+C1才等于 树节点C的值. D非叶子节点,未提供但也需要计算出来, 最后需要计算合计.结果如下:
a
7230
b
3265
c
5510
其中:c1
3633
d
32211
d1
6863
d2
4083
d3
8418
d4
9982
d5
2865
总计
48216


数据sql:
  1. with tmp as
  2. (select  'a' as s,7230 as c from dual union all  
  3. select  'b' as s,3265 as c from dual union all  
  4. select  'c' as s, 1877 as c from dual union all
  5. select  'c1' as s,3633 as c from dual union all
  6. select  'd1' as s,6863 as c from dual union all  
  7. select  'd2' as s, 4083 as c from dual union all
  8. select  'd3' as s,8418  as c from dual union all
  9. select  'd4' as s,9982  as c from dual union all
  10. select  'd5' as s,2865 as c from dual  )  
  11. select * from tmp
复制代码



论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-10 15:01:39
 楼主| 发表于 2020-1-13 17:01 | 显示全部楼层
想到了, 构建树形, 向上递归,然后求合计

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2020-1-13 23:14 | 显示全部楼层
层次关系就是靠项目名称来体现的?
你举的例子太简单,没有列出三层或更多级别的情况。

使用道具 举报

回复
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-10 15:01:39
 楼主| 发表于 2020-1-14 09:09 | 显示全部楼层
newkid 发表于 2020-1-13 23:14
层次关系就是靠项目名称来体现的?你举的例子太简单,没有列出三层或更多级别的情况。

因为树是约定好了的,  提供数据逻辑也是节点数据互斥的, 所以最后做的方式是, 定义一个树形基本信息表, left join 数据, 然后叶子节点向上递归, 求和.

使用道具 举报

回复
论坛徽章:
533
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2020-1-14 13:12 | 显示全部楼层
你构造的TMP表的示例数据,child 和 parent的关系都没有表达清楚,完全看不出来

使用道具 举报

回复
论坛徽章:
17
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26白羊座
日期:2015-10-10 15:01:39
 楼主| 发表于 2020-1-14 13:55 | 显示全部楼层
solomon_007 发表于 2020-1-14 13:12
你构造的TMP表的示例数据,child 和 parent的关系都没有表达清楚,完全看不出来

嗯, 确实没说明白, 我现在的做法是,因为树形结构约定已知, 就新增表落地树形结构定义,然后递归
  1. WITH TMP AS
  2. (SELECT 'a' AS S, 7230 AS C  FROM   DUAL  UNION ALL
  3.   SELECT 'b' AS S, 3265 AS C  FROM   DUAL  UNION ALL
  4.   SELECT 'c' AS S, 1877 AS C  FROM   DUAL  UNION ALL
  5.   SELECT 'c1' AS S, 3633 AS C  FROM   DUAL  UNION ALL
  6.   SELECT 'd1' AS S, 6863 AS C  FROM   DUAL  UNION ALL
  7.   SELECT 'd2' AS S, 4083 AS C  FROM   DUAL  UNION ALL
  8.   SELECT 'd3' AS S, 8418 AS C  FROM   DUAL  UNION ALL
  9.   SELECT 'd4' AS S, 9982 AS C  FROM   DUAL  UNION ALL
  10.   SELECT 'd5' AS S, 2865 AS C  FROM   DUAL),
  11. TMP2 AS  --树形结构信息
  12. (SELECT '总计' AS S, '' AS P_S, 0 AS ISLEAF  FROM   DUAL  UNION ALL
  13.   SELECT 'a' AS S, '总计' AS P_S, 1  FROM   DUAL  UNION ALL
  14.   SELECT 'b' AS S, '总计' AS P_S, 1  FROM   DUAL  UNION ALL
  15.   SELECT 'c' AS S, '总计' AS P_S, 0  FROM   DUAL  UNION ALL
  16.   SELECT 'd' AS S, '总计' AS P_S, 0  FROM   DUAL  UNION ALL
  17.   SELECT 'c1' AS S, 'c' AS P_S, 1  FROM   DUAL  UNION ALL
  18.   SELECT 'd1' AS S, 'd' AS P_S, 1  FROM   DUAL  UNION ALL
  19.   SELECT 'd2' AS S, 'd' AS P_S, 1  FROM   DUAL  UNION ALL
  20.   SELECT 'd3' AS S, 'd' AS P_S, 1  FROM   DUAL  UNION ALL
  21.   SELECT 'd4' AS S, 'd' AS P_S, 1  FROM   DUAL  UNION ALL
  22.   SELECT 'd5' AS S, 'd' AS P_S, 1  FROM   DUAL),
  23. TMP3 AS
  24. (SELECT A.*,B.C FROM TMP2 A
  25.   LEFT  JOIN TMP B
  26.   ON B.S=A.S),  
  27. TMP4(S,P_S,C,ISLEAF,C1) AS
  28. (SELECT S, P_S, C, ISLEAF, C AS C1
  29.   FROM   TMP3
  30.   WHERE  ISLEAF = 1
  31.   UNION ALL
  32.   SELECT T.S, T.P_S, T.C, T.ISLEAF, NVL(T.C, 0) + NVL(T1.C1, 0) AS C1
  33.   FROM   TMP3 T, TMP4 T1
  34.   WHERE  T.S = T1.P_S)
  35. SELECT S, SUM(C1) FROM TMP4 GROUP BY S ORDER BY S
复制代码

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时6.5折

【架构革新 自主可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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