求汇总的sql语句或思路

十二恨 2018-09-03 08:54:14
目前有两个表
tb1(id,dept_id,score); 这里是dept_id假设org_type=4 最下级的部门
tb2 (dept_id,dept_name,parent_dept,dept_type); 这是部门表 dept_type(1,2,3,4)1是最高部门。
目前最高部门要汇总最高部门下一级的就是dept_type=2的得分汇总。
这个sql怎么写。
tb2{
1,中国,0,1;
2,山东,1,2;
3,江苏,1,2;
4,青岛,2,3;
5,南京,3,3;
6,黄岛,4,4;
7,鼓楼,5,4;
8,江宁,5,4;
9,浙江,1,2;
}

tb1{
1,6,10; --黄岛10分
2,7,20; --鼓楼20分
3,8,30; --江宁30分

}

我用中国用户登录想得到汇总报表如下2级部门用连接,没有分也要显示:
山东 10分
江苏 50分
浙江 0分

求大神解答
...全文
225 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
十二恨 2018-09-05
  • 打赏
  • 举报
回复
引用 1 楼 nayi_224 的回复:
with tb2 as (

select 1 dept_id,'中国' dept_name,0 parent_dept,1 dept_type from dual union all
select 2,'山东',1,2 from dual union all
select 3,'江苏',1,2 from dual union all
select 4,'青岛',2,3 from dual union all
select 5,'南京',3,3 from dual union all
select 6,'黄岛',4,4 from dual union all
select 7,'鼓楼',5,4 from dual union all
select 8,'江宁',5,4 from dual union all
select 9,'浙江',1,2 from dual
)

, tb1 as(
select 1 id,6 dept_id,10 score from dual union all --黄岛10分
select 2,7,20 from dual union all --鼓楼20分
select 3,8,30 from dual --江宁30分

)
,tab3 as (
select t2.score,
connect_by_root(t1.dept_name) r_name,
connect_by_root(t1.dept_id) r_id
from tb2 t1, tb1 t2
where t1.dept_id = t2.dept_id(+)
start with t1.parent_dept = 1
connect by prior t1.dept_id = t1.parent_dept
)
select t1.r_id, r_name, nvl(sum(score), 0) from tab3 t1
group by t1.r_id, r_name
;


谢谢您,学习了,菜鸟第一次见这种查询语句。同时参考了
https://blog.csdn.net/stevendbaguo/article/details/44344639
yaiger 2018-09-03
  • 打赏
  • 举报
回复
这个问题不难的
思路:
1. 利用start with和connect by获取所有的分支,其中包括层级
2. 关联到tb2, 对获取的结果集汇总到第二层级

可以用一个SQL来完成
nayi_224 2018-09-03
  • 打赏
  • 举报
回复
with tb2 as (

select 1 dept_id,'中国' dept_name,0 parent_dept,1 dept_type from dual union all
select 2,'山东',1,2 from dual union all
select 3,'江苏',1,2 from dual union all
select 4,'青岛',2,3 from dual union all
select 5,'南京',3,3 from dual union all
select 6,'黄岛',4,4 from dual union all
select 7,'鼓楼',5,4 from dual union all
select 8,'江宁',5,4 from dual union all
select 9,'浙江',1,2 from dual
)

, tb1 as(
select 1 id,6 dept_id,10 score from dual union all --黄岛10分
select 2,7,20 from dual union all --鼓楼20分
select 3,8,30 from dual --江宁30分

)
,tab3 as (
select t2.score,
connect_by_root(t1.dept_name) r_name,
connect_by_root(t1.dept_id) r_id
from tb2 t1, tb1 t2
where t1.dept_id = t2.dept_id(+)
start with t1.parent_dept = 1
connect by prior t1.dept_id = t1.parent_dept
)
select t1.r_id, r_name, nvl(sum(score), 0) from tab3 t1
group by t1.r_id, r_name
;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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