请帮忙写出一个统计的sql语句--在线等待!(100分)

  • 主题发起人 主题发起人 whitehorse
  • 开始时间 开始时间
W

whitehorse

Unregistered / Unconfirmed
GUEST, unregistred user!
学员表t1:学号,姓名,性别代码,课程代码
课程表t2:课程代码,课程名
性别表t3:性别代码,性别名

要求统计,选每一科程的男女学生各是多少
select count(*) as 人数,t2.课程名 as 课程,t3.性别名 as 性别 from t1,t2,t3
where t1.课程代码=t2.课程代码 and t1.性别代码=t2.性别代码
group by t2.性别代码,t1.课程代码
虽然可以得出结果,但不符合要求,结果如下:

人数 课程 性别
10 物理 男
13 物理 女
12 化学 男
12 化学 女
11 数学 男
11 数学 女

我希望结果是如下形式:

课程 男 女
物理 10 13
化学 12 12
数学 11 11
 
一条语句可以做到,等几分钟,我先建个表试一试,
 
男。女分别统计然后union一下就可以了
 
在你的查询上再嵌套一层就可以了

先建一个试图,用你那个查询,
(我假设你那个查询是正确的)
假设名为test_v,
然后

select t1.kechengming,t1.renshu,t2.renshu
from test_v t1,test_v t2
where t1.kechengming=t2.kechengming
and t1.xingbie=male
and t2.xingbie=female
 
select distinct(s1.课程代码) as kcdm,
(select count(*) from t1 bt1 where at1.课程代码=bt1.课程代码 and bt1.性别代码=1 ) as xb1rs,
(select count(*) from t1 bt1 where at1.课程代码=bt1.课程代码 and bt1.性别代码=2 ) as xb2rs
from t1 at1 group by ate.课程代码
结果如下:
kcdm xb1rs xb2rs
1 72 78
2 76 71
3 78 67
4 75 83
在Sybase Adaptive Server Anywhere 6.0下通过,
BDE不行。
 
To bigroute:
我用sql2000,试了试你说的没成功,你写的数据表名我用点不清楚,能不能再说详细一点
谢谢
 
照bigroute说的弄出来,可结果集每一行的统计数字都是总人数
 
算来算去不行,应为你的性别问题,所以在一个语句中不能直接得到答案,至少要用临时表转换。
 
建个view:
create view v1 as
select count(*) as 男,0 as 女, t2.课程名 as 课程 from t1,t2,t3
where t1.课程代码=t2.课程代码 and t1.性别代码=t2.性别代码 and t1.性别代码='男'
group by t1.课程代码
union
select 0 as 男, count(*) as 女, t2.课程名 as 课程 from t1,t2,t3
where t1.课程代码=t2.课程代码 and t1.性别代码=t2.性别代码 and t1.性别代码='女'
group by t1.课程代码

select 课程, sum(男) as 男, sum(女) as 女 from v1 group by 课程
 
SELECT t2.课程名 as 课程,
SUM(CASE t1.性别代码 WHEN '1' THEN 1 ELSE 0 END) AS 男,
SUM(CASE t1.性别代码 WHEN '0' THEN 1 ELSE 0 END) AS 女
from t1,t2,t3
where t1.课程代码=t2.课程代码 and t1.性别代码=t3.性别代码

注:假设t1.性别代码的值为1代表男,t1.性别代码的值为0代表女;
SQL Server 2000中可以,好久没碰数据库了,可以试一下


 
select distinct(t1.课程代码) as kcdm,
(select count(*) from t1 bt1 where at1.课程代码=bt1.课程代码 and bt1.性别代码=1 ) as xb1rs,
(select count(*) from t1 bt1 where at1.课程代码=bt1.课程代码 and bt1.性别代码=2 ) as xb2rs
from t1 at1 group by ate.课程代码
at1=表t1
bt1=表t1
只不过在这里用了两个别名,因为有两个字段(xb1/2rs性别1/2人数)来自到某一个
记录集,为了匹配多个记录集就须要“at1.课程代码=bt1.课程代码 ”,等号两端的字段
必须是两个表里的字段,在这里用两个名字来实理。


 
用MASTER/DETAIL方法:
MASTER:
select count(*) as 人数,t2.课程名 as 课程 from t1,t2
where t1.课程代码=t2.课程代码
group by t1.课程代码
DETAIL:
select count(*) as 人数,t3.性别名 as 性别 from t1,t3
where 课程代码=:课程代码 and t1.性别代码=t3.性别代码
group by t3.性别代码
 
我将eachbuilder的语句稍加变动,实现的目的,很简便,谢谢大家
SELECT t2.课程名 AS 课程, SUM(CASE t1.性别代码 WHEN '1' THEN 1 ELSE 0 END) AS 男,
SUM(CASE t1.性别代码 WHEN '2' THEN 1 ELSE 0 END) AS 女
FROM t1, t2, t3
WHERE t1.课程代码 = t2.课程代码 AND t1.性别代码 = t3.性别代码
GROUP BY t2.课程名
 
Sorry,“t2.课程名”列为非聚合列,应该加上 GROUP BY 子句,
谢谢whitehorse,真该学习学习了,低级错误!!
 
多人接受答案了。
 
后退
顶部