SELECT COUNT(*) 人数, 男生数, 女生数, from 学校 group by 班级

nirvana007 2008-07-22 08:47:56
现有学校表
CLASS SEX
---------------------------
1 W
2 W
3 M
1 M
2 W
3 M
1 W
3 W
1 W
3 M
1 M
-----------------------------

SELECT COUNT(*) 人数, 男生数, 女生数, from 学校 group by 班级

其中男生数和女生数怎么得出来???


希望得出的格式为

班级 | 总人数 | 男生数 | 女生数
------------------------------
1 x x x

高手指教,希望用SQL语句来实现,不想用java或.net程序
...全文
3344 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_hgo 2008-07-23
  • 打赏
  • 举报
回复
create table CC
(
class int,
sex varchar(10)
)
insert into CC select 1,'W'
insert into CC select 2,'W'
insert into CC select 3,'M'
insert into CC select 1,'M'
insert into CC select 1,'M'
insert into CC select 1,'M'
insert into CC select 2,'W'
insert into CC select 3,'M'
insert into CC select 1,'W'
insert into CC select 3,'W'
insert into CC select 1,'W'
insert into CC select 3,'M'
insert into CC select 1,'M'
select class as ' 班级' ,
sum(case when sex='W' then 1 else 0 end) as '女生人数',
sum(case when sex='M' then 1 else 0 end) as '男生人数',
count(*) as '总人数'
from CC group by class
shuizhizhou0007 2008-07-23
  • 打赏
  • 举报
回复
select
班级,
count(1) as 总人数,
count(case when SEX='m' then 1 end ) as 男生数,
count(case when SEX='w' then 1 end ) as 女生数
from 学校
group by 班级
ws_hgo 2008-07-22
  • 打赏
  • 举报
回复
明天早上看
je_ck 2008-07-22
  • 打赏
  • 举报
回复
楼上的,你还需要总结一下,
就是
Select name,--可识别的字段,例如姓名,学校名,年级,等等。
Expr1,--关于你要算的东西1,比如Count('女生')as 女生数量,Sum('语文') as 语文成绩总和,avg('数学')as 数学平均成绩
Expr2,--和Expr1类似
.
.
.
from Table -- 你要查的表
Group by name--按这个统计
order by Expr1 ---顺序排列
水族杰纶 2008-07-22
  • 打赏
  • 举报
回复
普通行列转换
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

---------------------------------

/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

------------------
------------------

/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/

select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb
中国风 2008-07-22
  • 打赏
  • 举报
回复
select
班级,
count(1) as 总人数,
count(case when SEX='m' then 1 end ) as 男生数,
count(case when SEX='w' then 1 end ) as 女生数
from 学校
group by 班级
wgzaaa 2008-07-22
  • 打赏
  • 举报
回复
select class,count(1) as 总人数,
sum(sign(charindex('m',SEX))) as 男生数,
sum(sign(charindex('w',SEX))) as 女生数
from #1
group by class
----------------结果同一楼
1 5 2 3
2 2 0 2
3 4 3 1
lff642 2008-07-22
  • 打赏
  • 举报
回复


select 班级,count(1) as 总人数,
sum(case when SEX='m' then 1 else 0 end ) as 男生数,
sum(case when SEX='w' then 1 else 0 end ) as 女生数
from 学校
group by 班级

--这个可以的。


jack20080808 2008-07-22
  • 打赏
  • 举报
回复
select a.class (select count(1) from school b where class=a.class)as all ,(select count(1) from school b where class=a.class and sex='M')as M,,(select count(1) from school b where class=a.class and sex='W')as W from school a
hery2002 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wzy_love_sly 的回复:]
select 班级,count(1) as 总人数,
sum(case when SEX='m' then 1 else 0 end ) as 男生数,
sum(case when SEX='w' then 1 else 0 end ) as 女生数
from 学校
group by 班级
[/Quote]
这个就可以实现了,
就是一个count,group by
基本语句
wzy_love_sly 2008-07-22
  • 打赏
  • 举报
回复
select 班级,count(1) as 总人数,
sum(case when SEX='m' then 1 else 0 end ) as 男生数,
sum(case when SEX='w' then 1 else 0 end ) as 女生数
from 学校
group by 班级
ChinaITOldMan 2008-07-22
  • 打赏
  • 举报
回复
select classs,count(sex) as 总人数, sum( case when sex='M' then 1 esle 0 end) as 男生数,
sum(case when sex='W' then 1 else 0 end) as 女生数
from tb group by class
幸运的意外 2008-07-22
  • 打赏
  • 举报
回复
语句有好多种写法,楼上已经写了好多了.楼主可以比较一下运行效率,选择一个最高效的,并熟练运用.2楼的朋友方法最好,运行时间消耗最少方法也最优.
wwd252 2008-07-22
  • 打赏
  • 举报
回复

declare @school table (class int,sex varchar(10))
insert into @school
select 1, 'w' union all
select 2, 'm' union all
select 1, 'm' union all
select 3, 'm' union all
select 2, 'w' union all
select 1, 'w' union all
select 2, 'm' union all
select 1, 'm' union all
select 3, 'w'

select class,count(*) 班级人数
,sum(case when sex='w' then 1 else 0 end) woman
,sum(case when sex='m' then 1 else 0 end) man
from @school group by class

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧