首页 新闻 赞助 找找看

救助,主子表操作问题,焦急之中…

0
悬赏园豆:5 [已解决问题] 解决于 2012-08-28 10:41

数据表结构与记录如下所示:

 

 

现要得到下面的结果,如何用SQL语句实现:

部门  数量

A     2

B     3

即得到上级部门的出文数量(注意,出文数量包括上级出文数量与下级出文数量。),通过上面的记录可以分析得到。希望各位大虾帮忙下,谢谢了。

.NET快速开发框架的主页 .NET快速开发框架 | 小虾三级 | 园豆:946
提问于:2010-10-14 16:41
< >
分享
最佳答案
0
with dept(id,name,p_id) as (
select 1,'A',0 union all
select 2,'B',0 union all
select 3,'C',2 union all
select 4,'D',2
) ,
files(dept_id,name)
as (
select 1,'aa' union all
select 2,'bb' union all
select 3,'cc' union all
select 4,'dd' union all
select 1,'aa'
),
--> start here
tmp as (
select d.id,d.name,d.p_id,COUNT(*) cnt
from dept d,files f
where d.id=f.dept_id
group by d.id,d.name,d.p_id
) ,
cte
as (
select 0 lvl,name root_name,id,name,p_id,cnt
from tmp where p_id=0 --< begin here
union all
select lvl+1 lvl,c.name root_name,t.id,t.name,t.p_id,t.cnt cnt
from cte c,tmp t
where c.id=t.p_id
)
select root_name,SUM(cnt) cnt
from cte
group by root_name

root_name cnt
--------- -----------
A 2
B
3

 

:SQL  Server  2005 以上才支持递归CTE。

收获园豆:3
killkill | 小虾三级 |园豆:1192 | 2010-10-14 17:50
其他回答(1)
0

这个纯sql比较复杂,如果能联系程序代码实现就方便了,纯sql可以分步实现

1,取各部门的出文个数(不包含子部门)

select distinct  出文.部门号,count(出文.文名) as 数量 from 出文

这个结果集为table1

2,取有子部门的集合

select 部门.部门号,部门2.部门号 as 子部门好 from 部门 inner join 部门 部门2 on 部门.上级部门号=部门2.部门号

这个结果集为table2

3,取各部门的子部门的出文个数

select distinct table2.部门号,count(table1.数量) as 数量 from table2 inner join table1 on table2.子部门好 = table1.部门号

这个结果为table3

4,实现结果select distinct table1.部门号,sum(table1.数量+table3.数量) from table1 left join table3 on table1.部门号=table3.部门号

5,将上述几步的table1,table2,table3用个步骤的语句代替即可

收获园豆:2
茂茂 | 园豆:2892 (老鸟四级) | 2010-10-14 17:52
多层下级部门怎么办?
支持(0) 反对(0) killkill | 园豆:1192 (小虾三级) | 2010-10-14 20:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册