真正的专业问题待答
表A:
UserID varchar(50) //学生编码
ClassID varchar(50) //班级编码
UserName varchar(50) //姓名
TypeID varchar(50) //所属组
数据内容如下:
UserID ClassID UserName TypeID
1001 1 张三 10
1002 2 李四 11
1003 3 王五 12
1004 4 赵六 12
1006 3 韩七 11
1007 2 马八 13
表B:
ClassID varchar(50)
ClassName varchar(50)
数据内容如下:
ClassID ClassName
1 一班
2 二班
3 三班
4 四班
表C:
TypeID varchar(50)
TypeName varchar(50)
数据内容如下:
TypeID TypeName
10 第一组
11 第二组
12 第三组
13 第四组
现在的要求是统计出如下的表:
班级 第一组人数 第二组人数 第三组人数 第四组人数 合计
一班 1 1 2 1 5
二班 2 1 2 3 8
三班 1 3 1 1 6
四班 3 3 2 1 9
各位老大,这是我辛苦手工写出来的,很多系统统计经常用到的功能,但是大多数都是一个一个字段的统计,极费资源,大家好好看看,如何用最少的SQL实现,并达到最佳资源利用?
[解决办法]
--楼主给的数据和你要的结果不对啊!
drop table 表A,表B,表C
go
create table 表A(UserID varchar(50),ClassID varchar(50),UserName varchar(50),TypeID varchar(50))
insert into 表A
select '1001 ', '1 ', '张三 ',10
union all select '1002 ', '2 ', '李四 ',11
union all select '1003 ', '3 ', '王五 ',12
union all select '1004 ', '4 ', '赵六 ',12
union all select '1006 ', '3 ', '韩七 ',11
union all select '1007 ', '2 ', '马八 ',13
create table 表B(ClassID varchar(50),ClassName varchar(50))
insert into 表B
select '1 ', '一班 '
union all select '2 ', '二班 '
union all select '3 ', '三班 '
union all select '4 ', '四班 '
create table 表C(TypeID varchar(50),TypeName varchar(50))
insert into 表C
select '10 ', '第一组 '
union all select '11 ', '第二组 '
union all select '12 ', '第三组 '
union all select '13 ', '第四组 '
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ',sum(case when TypeName= ' ' '+TypeName+ ' ' ' then 1 else 0 end) as ' ' '+TypeName+ '人数 ' ' '
from 表C
exec( 'select ClassName '+@sql+ ',(select count(*) from 表A a where a.ClassID=表A.ClassID) as ' '合计 ' ' from 表A,表B,表C where 表A.ClassID=表B.ClassID and 表A.TypeID=表C.TypeID group by 表A.ClassID,ClassName ')
/*
ClassName 第一组人数 第二组人数 第三组人数 第四组人数 合计
---------------- ----------- ----------- ----------- ----------- -----------
一班 1 0 0 0 1
二班 0 1 0 1 2
三班 0 1 1 0 2
四班 0 0 1 0 1
*/