表A:departid(部门代码)varchar 100  departname (部门名称)varchar 30   departempCount (部门人数) int
A                                **公司       
A01                              总务部
A0101                              人事部
A0102                              公关部
A02                              制造部 
A0201                             装配一车间
A0202                             装配二车间
A03                               财务部
A04                               销售部
。。其中像A则是公司或者理解为总部门,A0101 ,A0201等则是相应A01 ,A02的子部门表B:
departid varchar 100 部门代码    employeeid varchar 10员工编号        employeename char 30员工姓名
A01                                  HR9910                                  AAA
A0101                                SSC002                                  BBB 
A0201                                FA0115                                  CCC

求:一条SQL语句将统计表A中的departempCount数据,统计各部门的人员数据,注意像A01,A02这样的部门人数应该是包含下级部门及本部门的人员在内,A部门则应该是公司所有人员的数据合计

解决方案 »

  1.   

    IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
    IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
    CREATE TABLE A(
    departid varchar(100)
    ,departname varchar(30)  
    ,departempCount int 
    )
    INSERT INTO  A(DEPARTID,DEPARTNAME)
    SELECT 'A','**公司' UNION ALL     
    SELECT 'A01','总务部' UNION ALL   
    SELECT 'A0101','人事部' UNION ALL   
    SELECT 'A0102','公关部' UNION ALL   
    SELECT 'A02','制造部' UNION ALL   
    SELECT 'A0201','装配一车间' UNION ALL   
    SELECT 'A0202','装配二车间' UNION ALL   
    SELECT 'A03','财务部' UNION ALL   
    SELECT 'A04','销售部'
    CREATE TABLE B(
    departid varchar(100)   
    ,employeeid varchar(10)   
    ,employeename char(30)
    )
    INSERT INTO B
    SELECT 'A01','HR9910','AAA' UNION ALL
    SELECT 'A0101','SSC002','BBB' UNION ALL
    SELECT 'A0201','FA0115','CCC'SELECT T3.DEPARTID
    ,T3.departname
    ,(SELECT COUNT(1) FROM B T2 WHERE T2.DEPARTID LIKE T1.DEPARTID+'%') '人员总计' 
    FROM B T1
    RIGHT JOIN A T3 ON T1.DEPARTID=T3.DEPARTID
    /*
    A **公司 0
    A01 总务部 2
    A0101 人事部 1
    A0102 公关部 0
    A02 制造部 0
    A0201 装配一车间 1
    A0202 装配二车间 0
    A03 财务部 0
    A04 销售部 0
    */
      

  2.   

    写错了,改一下
    IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
    IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
    CREATE TABLE A(
    departid varchar(100)
    ,departname varchar(30)  
    ,departempCount int 
    )
    INSERT INTO  A(DEPARTID,DEPARTNAME)
    SELECT 'A','**公司' UNION ALL     
    SELECT 'A01','总务部' UNION ALL   
    SELECT 'A0101','人事部' UNION ALL   
    SELECT 'A0102','公关部' UNION ALL   
    SELECT 'A02','制造部' UNION ALL   
    SELECT 'A0201','装配一车间' UNION ALL   
    SELECT 'A0202','装配二车间' UNION ALL   
    SELECT 'A03','财务部' UNION ALL   
    SELECT 'A04','销售部'
    CREATE TABLE B(
    departid varchar(100)   
    ,employeeid varchar(10)   
    ,employeename char(30)
    )
    INSERT INTO B
    SELECT 'A01','HR9910','AAA' UNION ALL
    SELECT 'A0101','SSC002','BBB' UNION ALL
    SELECT 'A0201','FA0115','CCC'SELECT T3.DEPARTID
    ,T3.departname
    ,(SELECT COUNT(1) FROM B T2 WHERE T2.DEPARTID LIKE T3.DEPARTID+'%') '人员总计' 
    FROM B T1
    RIGHT JOIN A T3 ON T1.DEPARTID=T3.DEPARTID
    /*
    A **公司 3
    A01 总务部 2
    A0101 人事部 1
    A0102 公关部 0
    A02 制造部 1
    A0201 装配一车间 1
    A0202 装配二车间 0
    A03 财务部 0
    A04 销售部 0
    */
      

  3.   

    SELECT COUNT(1) FROM B T2 WHERE T2.DEPARTID LIKE T3.DEPARTID+'%') '人员总计' 
    FROM B T1count(1)是何意?可否请楼上的解释一下?
      

  4.   

    不用子查询用连接也可以,LZ自己试试哪个效率高吧
    SELECT T3.DEPARTID
    ,T3.departname
    ,COUNT(T1.employeeid) '人员总计' 
    FROM B T1
    RIGHT JOIN A T3 ON T1.DEPARTID LIKE T3.DEPARTID+'%'
    GROUP BY T3.DEPARTID,T3.departname
      

  5.   

    统计个数,和COUNT(*)效果一样,随便用哪个都行
      

  6.   

    我是更新表A的字段,应该是Update语句
      

  7.   

    --> 测试数据: [a]
    if object_id('[a]') is not null drop table [a]
    create table [a] (departid varchar(5),departname varchar(10),departempCount int)
    insert into [a]
    select 'A','**公司',null union all
    select 'A01','总务部',null union all
    select 'A0101','人事部',null union all
    select 'A0102','公关部',null union all
    select 'A02','制造部',null union all
    select 'A0201','装配一车间',null union all
    select 'A0202','装配二车间',null union all
    select 'A03','财务部',null union all
    select 'A04','销售部',null
    --> 测试数据: [B]
    if object_id('[B]') is not null drop table [B]
    create table [B] (departid varchar(5),employeeid varchar(6),employeename varchar(3))
    insert into [B]
    select 'A01','HR9910','AAA' union all
    select 'A0101','SSC002','BBB' union all
    select 'A0201','FA0115','CCC'
    update A set departempCount=(select count(1) from b where departid like a.departid+'%') from aselect * from [A]--结果:
    departid departname departempCount
    -------- ---------- --------------
    A        **公司       3
    A01      总务部        2
    A0101    人事部        1
    A0102    公关部        0
    A02      制造部        1
    A0201    装配一车间      1
    A0202    装配二车间      0
    A03      财务部        0
    A04      销售部        0
      

  8.   

    把原表和结果表连接就行了
    IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
    IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
    CREATE TABLE A(
    departid varchar(100)
    ,departname varchar(30)  
    ,departempCount int 
    )
    INSERT INTO  A(DEPARTID,DEPARTNAME)
    SELECT 'A','**公司' UNION ALL     
    SELECT 'A01','总务部' UNION ALL   
    SELECT 'A0101','人事部' UNION ALL   
    SELECT 'A0102','公关部' UNION ALL   
    SELECT 'A02','制造部' UNION ALL   
    SELECT 'A0201','装配一车间' UNION ALL   
    SELECT 'A0202','装配二车间' UNION ALL   
    SELECT 'A03','财务部' UNION ALL   
    SELECT 'A04','销售部'
    CREATE TABLE B(
    departid varchar(100)   
    ,employeeid varchar(10)   
    ,employeename char(30)
    )
    INSERT INTO B
    SELECT 'A01','HR9910','AAA' UNION ALL
    SELECT 'A0101','SSC002','BBB' UNION ALL
    SELECT 'A0201','FA0115','CCC'UPDATE A SET departempCount=T.TOTAL
    FROM A 
    INNER JOIN (
    SELECT T3.DEPARTID
    ,T3.departname
    ,COUNT(T1.employeeid) 'TOTAL' 
    FROM B T1
    RIGHT JOIN A T3 ON T1.DEPARTID LIKE T3.DEPARTID+'%'
    GROUP BY T3.DEPARTID,T3.departname) T ON A.DEPARTID=T.DEPARTID
    SELECT * FROM A
    /*
    A **公司 3
    A01 总务部 2
    A0101 人事部 1
    A0102 公关部 0
    A02 制造部 1
    A0201 装配一车间 1
    A0202 装配二车间 0
    A03 财务部 0
    A04 销售部 0
    */
      

  9.   


    为什么要还要连接一下:不连接不是也可以吗?
    SELECT T3.DEPARTID,T3.departname,(SELECT COUNT(*) FROM B T2 WHERE T2.DEPARTID LIKE T3.DEPARTID+'%') '人员总计' 
    FROM A t3