34,837
社区成员




use tempdb
go
create table dept(dept_id int, name nvarchar(10), parent_dept_pid int);
insert into dept(dept_id, name, parent_dept_pid)values(1, 'it', null);
insert into dept(dept_id, name, parent_dept_pid)values(2, '软件开发', 1);
insert into dept(dept_id, name, parent_dept_pid)values(3, '报表开发', 2);
insert into dept(dept_id, name, parent_dept_pid)values(4, 'web开发', 2);
create table [user](user_id int, name nvarchar(10), dept_id int);
insert into [user](user_id, name, dept_id)values(885, '小明', 3);
insert into [user](user_id, name, dept_id)values(455, '小张', 4);
insert into [user](user_id, name, dept_id)values(555, '小x', 2);
select distinct [user].name, shop.name as shop,
case when [user].dept_id in(科室.dept_id, dept.dept_id) then dept.name end as dept,
case when [user].dept_id in(科室.dept_id) then 科室.name end as 科室
from dept shop
left join dept dept on dept.parent_dept_pid = shop.dept_id
left join dept 科室 on 科室.parent_dept_pid = dept.dept_id
inner join [user] on [user].dept_id in(科室.dept_id, dept.dept_id, shop.dept_id)
where shop.parent_dept_pid is null
/*
name shop dept 科室
---------- ---------- ---------- ----------
小x it 软件开发 NULL
小明 it 软件开发 报表开发
小张 it 软件开发 web开发
*/
;with data as(
select [user].name, dept.name as dept, dept.parent_dept_pid, level = 0
from [user], dept
where [user].dept_id = dept.dept_id
union all
select data.name, dept.name as dept, dept.parent_dept_pid, level = data.level+1
from dept, data
where dept.dept_id = data.parent_dept_pid
)
select name, [2] as shop, [1] as dept, [0] as 科室
from(select name, dept, level from data ) data
pivot( max(dept) for level in ([0], [1], [2])) p
*--
name shop dept 科室
---------- ---------- ---------- ----------
小x NULL it 软件开发
小明 it 软件开发 报表开发
小张 it 软件开发 web开发
--*/
go
drop table dept, [user]