SQL的联合统计查询问题 A表 
编号  姓名  年龄  
01    张三  20 
02    李四  21 
03    王二  23 B表 存放不良记录 
编号  编号  事件 
B001  01    喝酒闹事 
B002  02    喝酒闹事 
B003  01    喝酒闹事 
B004  03    喝酒闹事 C表 存放良好记录 
编号  编号  事件
C001  01    助人为乐 
C002  01    助人为乐 
C003  01    助人为乐 
C004  03    助人为乐 D表 存放其他记录
编号  编号  事件
D001  01    其他01 
D002  01    其他02  
D003  01    其他04  
D004  03    其他05  现要求统计结果如下 编号  姓名  年龄  不良记录数  良好记录数 其他记录数
01    张三  20    2          3           3
02    李四  21    1          0           0
03    王二  23    1          1           1
怎么用一条SQL解决这个问题? 我用下面的语句统计,但是统计失败了,为什么?
SELECT 
A.*,
ISNULL(COUNT(B.事件),0)不良记录数,
ISNULL(COUNT(C.事件),0)良好记录数,
ISNULL(COUNT(D.事件),0)其他记录数,FROM 
A LEFT JOIN B 
ON A.编号=B.编号 
LEFT JOIN C ON A.编号=C.编号
LEFT JOIN C ON A.编号=C.编号
LEFT JOIN D ON A.编号=D.编号GROUP BY A.编号 , A.姓名 , A.年龄  

解决方案 »

  1.   

    SELECT 
    A.*, 
    ISNULL(COUNT(B.事件),0)不良记录数, 
    ISNULL(COUNT(C.事件),0)良好记录数, 
    ISNULL(COUNT(D.事件),0)其他记录数
    FROM 
    A LEFT JOIN B 
    ON A.编号=B.编号 
    LEFT JOIN C ON A.编号=C.编号 
    LEFT JOIN D ON A.编号=D.编号 
    GROUP BY A.编号,A.姓名,A.年龄 
      

  2.   

    不好意思,我打错了,但是还是不行A表 
    编号  姓名  年龄  
    01    张三  20 
    02    李四  21 
    03    王二  23 B表 存放不良记录 
    id  编号  事件 
    B001  01    喝酒闹事 
    B002  02    喝酒闹事 
    B003  01    喝酒闹事 
    B004  03    喝酒闹事 C表 存放良好记录 
    id  编号  事件 
    C001  01    助人为乐 
    C002  01    助人为乐 
    C003  01    助人为乐 
    C004  03    助人为乐 D表 存放其他记录 
    id  编号  事件 
    D001  01    其他01 
    D002  01    其他02  
    D003  01    其他04  
    D004  03    其他05  数据量多了统计结果就会错,不知道为什么
      

  3.   

    SELECT
      A.*, 
      ISNULL(不良记录,0) as 不良记录数, 
      ISNULL(良好记录,0) as 良好记录数, 
      ISNULL(其他记录,0) as 其他记录数
    FROM A
    LEFT JOIN (
      SELECT 编号 , count(1) as 不良记录
      FROM B表
      GROUP BY 编号) as B on B.编号=A.编号
    LEFT JOIN (
      SELECT 编号 , count(1) as 良好记录
      FROM C表 
      GROUP BY 编号) as C on C.编号=A.编号
    LEFT JOIN (
      SELECT 编号 , count(1) as 其他记录
      FROM D表
      GROUP BY 编号) as D on D.编号=A.编号
      

  4.   


    select a.*,
    isnull(不良记录,0) 不良记录,
    isnull(良好记录,0) 良好记录,
    isnull(其它记录,0) 其它记录
    from A表 a
    left join (select 编号,count(1) 不良记录 from B表 group by 编号) b on a.编号 = b.编号
    left join (select 编号,count(1) 良好记录 from C表 group by 编号) c on a.编号 = c.编号
    left join (select 编号,count(1) 其它记录 from D表 group by 编号) d on a.编号 = d.编号
      

  5.   


    select 编号,姓名,
    (case when 登记记录集.不良记录 is null then 0 else 登记记录集.不良记录 end),
    (case when 登记记录集.良好记录 is null then 0 else 登记记录集.良好记录 end),
    (case when 登记记录集.其他记录 is null then 0 else 登记记录集.良好记录 end)
     from 
    A left join 
    (SELECT B.编号1,B.不良记录,c.良好记录,d.其他记录
    from (SELECT 编号1,COUNT(事件) as 不良记录 from  B group by 编号1) B,
         (SELECT 编号1,COUNT(事件)  as 良好记录 from  C group by 编号1) C,
         (SELECT 编号1,COUNT(事件) as 其他记录 from  D group by 编号1) Dwhere b.编号1=c.编号1 and c.编号1=d.编号1) 登记记录集on A.编号=登记记录集.编号1
      

  6.   

    我把BCD表里的编号命名成编号1,因为BCD表中有2个相同名字的列名
      

  7.   


    declare @A table(编号 varchar(2),姓名 varchar(10),年龄 int)
    insert into @A
    select '01','张三',20 union all
    select '02','李四',20 union all
    select '03','王二',20 declare @B table(不良编号 varchar(4),编号 varchar(2),事件 varchar(50))
    insert into @B
    select 'B001','01','喝酒闹事' union all
    select 'B002','02','喝酒闹事' union all
    select 'B003','01','喝酒闹事' union all
    select 'B004','03','喝酒闹事' declare @C table(良好编号 varchar(4),编号 varchar(2),事件 varchar(50))
    insert into @C
    select 'C001','01','助人为乐' union all
    select 'C002','01','助人为乐' union all
    select 'C003','01','助人为乐' union all
    select 'C004','03','助人为乐' declare @D table(其他编号 varchar(4),编号 varchar(2),事件 varchar(50))
    insert into @D
    select 'D001','01','其他01' union all
    select 'D002','01','其他02' union all
    select 'D003','01','其他03' union all
    select 'D004','03','其他04' select a.*,
    isnull(不良记录数,0) 不良记录数,
    isnull(良好记录数,0) 良好记录数,
    isnull(其它记录数,0) 其它记录数
    from @A a
    left join (select 编号,count(1) as 不良记录数 from @B group by 编号) b on a.编号 = b.编号
    left join (select 编号,count(1) as 良好记录数 from @C group by 编号) c on a.编号 = c.编号
    left join (select 编号,count(1) as 其它记录数 from @D group by 编号) d on a.编号 = d.编号
    /*-------------------------------------------------------
     编号  姓名  年龄 不良记录数 良好记录数 其他记录数
     01    张三    20 2    3       3
      02    李四    20 1    0       0
      03    王二    20 1          1          1
     --------------------------------------------------------*/