名字 部门 上级
A z B
B x
查询出
名字 部门 上级 上级人数
A z B 1
B x 0
------解决方案--------------------
with mytable as (
select 'A' id , 'z' dept ,'B' pid
union all select 'B' , 'X',''
)
select x.id , x.dept,x.pid , case when y.id is null then 0 else 1 end as count
from mytable x left join mytable y on x.pid = y.id
------解决方案--------------------
id dept pid count
---- ---- ---- -----------
A z B 1
B X 0
(2 行受影响)
------解决方案--------------------
借用楼上的
select x.名字 , x.部门,x.上级 , case when y.名字 is null then 0 else 1 end as 上级人数
from [table] x
left join [table] y
on x.上级 = y.名字
------解决方案--------------------
这个结果不就是你一楼要的结果吗
------解决方案--------------------
应该符合你的要求吧:
create table pro
(名字 char(20),
部门 CHAR(20),
上级 char(10)
)
insert into pro
values('A','Z','B'),
('B','x',''),
('A','Z','C'),
('C','x','B')
with ta
as(select 名字,部门,
SUM(case when isnull(上级,'')<>'' then 1 else 0 end) 上级人数 from pro
group by 名字,部门)
select a.*,b.上级人数 from pro a,ta b
where a.名字=b.名字 and a.部门=b.部门
order by a.名字
截图如下:
------解决方案--------------------
create table 人员
(名字 char(20),
部门 CHAR(20),
上级 char(10)
)
insert into 人员
values('A','Z','B'),
('B','x','C'),
('C','x','d')
truncate table 人员
go
alter function Get人员(@Dept_name nvarchar(20))
returns @Tab table(名字 CHAR(20) ,部门 CHAR(20),上级 CHAR(10))
begin
WITH 上级人员 AS(
-- 定位点成员
SELECT * FROM 人员
WHERE 名字 = @Dept_name
UNION ALL
-- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
SELECT A.*
FROM 人员 A, 上级人员 B
WHERE a.名字 = b.上级
)
insert into @tab(名字,部门,上级) SELECT 名字,部门,上级 FROM 上级人员
return
end
select a.名字,COUNT(B.名字)上级人数 from 人员 a outer apply dbo.Get人员(a.名字) b group by a.名字
go