数据表结构与记录如下所示:
|
现要得到下面的结果,如何用SQL语句实现:
部门 数量
A 2
B 3
即得到上级部门的出文数量(注意,出文数量包括上级出文数量与下级出文数量。),通过上面的记录可以分析得到。希望各位大虾帮忙下,谢谢了。
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。
这个纯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用个步骤的语句代替即可