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.年龄
编号 姓名 年龄
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.年龄
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.年龄
编号 姓名 年龄
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 数据量多了统计结果就会错,不知道为什么
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.编号
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.编号
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
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
--------------------------------------------------------*/