有一个部门表有个path字段记录了公司部门和车间。另一个表是人员表,记录了部门的id。

怎么求出每个部门的所有人数。       因为有的人直属于部门,有的人直属于车间, 车间属于部门。     1629334081(1).jpg

备考FCRP 发布于 2021-8-19 08:48
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
0
备考FCRPLv4见习互助
发布于2021-8-20 07:41

最后通过   substring_index( substring_index( d.path, '.', 2 ), '.', '-1' )  解决的, 我们这path字段里面记录了公司编码、部门编码、车间编码。  级次3到5级,但是第一级是公司,第二级是部门,后面车间有小车间。   我就光把二级部门用 substring_index 函数截取出来了,然后前面字段用count函数统计一下就能求出总人数了。      

最佳回答
0
陈阿大Lv5初级互助
发布于2021-8-19 08:50

sql 的分组统计查询,group by

  • 备考FCRP 备考FCRP(提问者) 我知道group by 但是有的人直接对应部门,有的人对应车间。 现在要求统计部门的总人数,车间属于部门也需要统计。
    2021-08-19 08:57 
  • 陈阿大 陈阿大 回复 备考FCRP(提问者) select 部门id, sum(t.num ) from (select 部门id,车间id ,count(0) as num from 人员表 group by 部门id,车间id union all select 部门id ,\'0\',count(0) as num from 人员表 group by 部门id) t group by 部门id
    2021-08-19 09:34 
  • 陈阿大 陈阿大 回复 备考FCRP(提问者) 大概就是这个意思,求出部门直接人数,车间直接人数,将两个合并求总人数
    2021-08-19 09:36 
  • 备考FCRP 备考FCRP(提问者) 回复 陈阿大 部门和车间都在一个表中。 就是father_id 关联
    2021-08-19 10:20 
最佳回答
0
hfjsiwbdhxLv5初级互助
发布于2021-8-19 08:52

group by path

最佳回答
0
Z4u3z1Lv6专家互助
发布于2021-8-19 09:04

----sql 逐级递归汇总

--测试数据

with area(id,"name",f_id,leve) as (

  select  1,'中国',0,1 union all

  select  2,'湖北',1,2 union all

  select  3,'武汉',2,3 union all

  select  4,'云贵',1,2 union all

  select  5,'云南',4,3 union all

  select  6,'贵阳',4,3 union all

  select  7,'云南子区',5,4 union all

  select  8,'贵阳子区',6,4 union all

  select  9,'蔡甸',2,3

), "table"(id,area_id,"money") as (

  select  1,3,10 union all

  select  2,9,5 union all

  select  3,7,20 union all

  select  4,8,30

)

--使用cte递归求出每个节点的路径

,t(id,f_id,"name","level",fullpath) as (

  select a.id,a.f_id,a."name",a.leve,cast(a.id as varchar(max))

  from area a

  where a.leve=1

  union all

  select b.id,b.f_id,b."name",b.leve,t.fullpath+'->'+cast(b.id as varchar(max))

  from area b

  inner join t on t.id=b.f_id

)

--汇总统计每个节点的金额

select t.id,t."name",t."level",sum(c."money") as "money"

from t

inner join t t1 on charindex(t.fullpath,t1.fullpath)=1

inner join "table" c on c.area_id=t1.id

group by t.id,t."name",t."level"

--having t."level"=2 --筛选出第二层级

order by t.id

递归后的结果

image.png

  • 备考FCRP 备考FCRP(提问者) 大概是这个意思,求出公司的总人数,部门的总人数,车间的总人数。 但是思路说一下呗,看不太懂这个sql
    2021-08-19 09:12 
  • 备考FCRP 备考FCRP(提问者) 数据库是mysql57版本的
    2021-08-19 09:15 
  • Z4u3z1 Z4u3z1 回复 备考FCRP(提问者) https://blog.csdn.net/lilizhou2008/article/details/108505353 mysql
    2021-08-19 09:26 
  • 备考FCRP 备考FCRP(提问者) 回复 Z4u3z1 看了 还是不太明白,这个讲的向下递归和向上递归 ,然后mysql怎么算那个 部门的总人数。
    2021-08-19 09:43 
最佳回答
0
用户a8068717Lv4初级互助
发布于2021-8-19 13:19
  • 3关注人数
  • 585浏览人数
  • 最后回答于:2021-8-20 07:41
    请选择关闭问题的原因
    确定 取消
    返回顶部