最近遇到一个地区数据汇总的问题,地区下的地址呈树形结构,(简化结构)如A市下有B、C区,B区下有D、E街道。先要查询所有地区的人数(包括子区域),如A的人数=直属A的人数+B的人数+C的人数+D的人数+E的人数。C的人数=直属C的人数。
地址结构如图:
地区直属人数如下
查询结果如下
实现如下
WITH a AS(
SELECT 'A' 地址, 10 总人数, 8 正常人数, 2 欠费人数 FROM dual
UNION ALL
SELECT 'B', 20, 15, 5 FROM dual
UNION ALL
SELECT 'C', 30, 29, 1 FROM dual
UNION ALL
SELECT 'D', 40, 20, 20 FROM dual
UNION ALL
SELECT 'E', 50, 32, 18 FROM dual
),
b AS(
SELECT 'B' 地址, 'A' 上级地址 FROM dual
UNION ALL
SELECT 'C', 'A' FROM dual
UNION ALL
SELECT 'D', 'B' FROM dual
UNION ALL
SELECT 'E', 'B' FROM dual
UNION ALL
SELECT 'A', NULL FROM dual
),
c AS(
SELECT 'A' 地址 FROM dual
UNION ALL
SELECT 'B' FROM dual
UNION ALL
SELECT 'C' FROM dual
UNION ALL
SELECT 'D' FROM dual
UNION ALL
SELECT 'E' FROM dual
)
SELECT c.地址,(SELECT sum(a.总人数) FROM a WHERE a.地址 IN (SELECT b.地址 FROM b START WITH b.地址 = c.地址 CONNECT BY prior b.地址 = b.上级地址)) 总人数,(SELECT sum(a.正常人数) FROM a WHERE a.地址 IN (SELECT b.地址 FROM b START WITH b.地址 = c.地址 CONNECT BY prior b.地址 = b.上级地址)) 正常人数,(SELECT sum(a.欠费人数) FROM a WHERE a.地址 IN (SELECT b.地址 FROM b START WITH b.地址 = c.地址 CONNECT BY prior b.地址 = b.上级地址)) 欠费人数
FROM c;
虽然上叙方案能够查询出对的数据,但是其效率太低,如果有优化的方法可以在下面留言或者私聊我。