注册 登录
编程论坛 SQL Server论坛

Select语句实现的一个问题

zhaozhiwei 发布于 2007-11-10 18:22, 1388 次点击

求参加人数最多的社会团体的名称和参加人数
用select怎么实现啊?
我这样写的 ,结果报错。
select 社会团体.编号, 社会团体.名称 , max(count(职工号))
from 参加, 社会团体
where 社会团体.编号=参加.编号
group by 社会团体.编号,社会团体.名称 ;
大家来帮一下忙
表结构如下
职工(职工号,姓名,年龄,性别)
社会团体(编号,名称,负责人,活动地点)
参加(职工号,编号,参加日期)

16 回复
#2
purana2007-11-10 19:03
create table 社会团体(
编号 int,
名称 varchar(60),
负责人 varchar(20),
活动地点 varchar(500)
)

insert into 社会团体 values(1,'红十字会','李明','广州天河区')
insert into 社会团体 values(2,'养老院义工','陈强','广州各区')

create table 参加(
职工号 int,
编号 int,
参加日期 datetime)

insert into 参加 values(1,1,'2007-10-5')
insert into 参加 values(2,1,'2007-10-5')
insert into 参加 values(3,1,'2007-10-5')
insert into 参加 values(4,2,'2007-10-5')
insert into 参加 values(5,2,'2007-10-5')
insert into 参加 values(6,2,'2007-10-5')
insert into 参加 values(7,2,'2007-10-5')
insert into 参加 values(8,2,'2007-10-5')
insert into 参加 values(9,2,'2007-10-5')
insert into 参加 values(10,2,'2007-10-5')


select top 1a.名称,a.负责人,a.活动地点,b.参加人数
from 社会团体 a
join
(select 编号,count(1) as 参加人数 from 参加 group by 编号) b
on a.编号=b.编号
order by b.参加人数 desc

drop table 社会团体,参加

/*
养老院义工 陈强 广州各区 7
*/
#3
zhaozhiwei2007-11-10 19:18

楼上的学长真厉害
我有学到了很多知识
不过我还有一个问题
就是
查找参加了职工号为 “1102”的职工所参加的全部社会团体的职工号
我是这么写的,你看对不,我看不对,但我不知道怎么修改。
select 职工号
from 职工
where not exists (
select *
from 社会团体
where not exists(
select *
from 参加
where 职工.职工号 = 参加.职工号 and 社会团体.编号=参加.编号 and 参加.职工='1002'));

#4
purana2007-11-10 19:51
create table 社会团体(
编号 int,
名称 varchar(60),
负责人 varchar(20),
活动地点 varchar(500)
)

insert into 社会团体 values(1,'红十字会','李明','广州天河区')
insert into 社会团体 values(2,'养老院义工','陈强','广州各区')

create table 参加(
职工号 varchar(6),
编号 int,
参加日期 datetime)

insert into 参加 values('1001',1,'2007-10-5')
insert into 参加 values('1002',1,'2007-10-5')
insert into 参加 values('1003',2,'2007-10-5')
insert into 参加 values('1005',1,'2007-10-5')
insert into 参加 values('1008',2,'2007-10-5')
insert into 参加 values('1009',1,'2007-10-5')
insert into 参加 values('1010',2,'2007-10-5')

create table 职工(
职工号 varchar(6),
姓名 varchar(20),
年龄 smallint,
性别 bit --1表示男,0表示女
)

insert into 职工 values('1001','李伟',37,1)
insert into 职工 values('1002','赵天',22,1)
insert into 职工 values('1003','王容',27,0)
insert into 职工 values('1004','叶茜',31,0)
insert into 职工 values('1005','唐蓎',30,0)
insert into 职工 values('1006','方文',24,0)
insert into 职工 values('1007','曾强',34,1)
insert into 职工 values('1008','李静',22,0)
insert into 职工 values('1009','李媚媚',25,0)
insert into 职工 values('1010','何一',30,1)

select a.职工号,a.姓名,a.年龄,性别=case when a.性别=1 then '男' else '女' end
from 职工 a,(select 编号 from 参加 where 职工号='1002') b,参加 c
where a.职工号=c.职工号 and b.编号=c.编号

drop table 社会团体,参加,职工
#5
purana2007-11-10 19:55
/*

1001 李伟 37 男
1002 赵天 22 男
1005 唐蓎 30 女
1009 李媚媚 25 女

*/
#6
zhaozhiwei2007-11-10 19:58
嗯 谢谢版主了 !
#7
zhaozhiwei2007-11-10 21:15
版主可在呀 , 发现问题了。
你的理解有误啊 要求是要查找参加了职工号为 “1002”的职工所参加的全部社会团体的职工号
你的测试数据不完整吧,
如果1002参加了两个团体或更多的话,
select a.职工号,a.姓名,a.年龄,性别=case when a.性别=1 then '男' else '女' end
from 职工 a,(select 编号 from 参加 where 职工号='1002') b,参加 c
where a.职工号=c.职工号 and b.编号=c.编号
这几句话的功能就是查找只要参加了 1002所参加的任意一个团体 的职工了,
而题目的意思是查找 那些参加了 1002所参加的全部团体 的职工
是不是?那该怎么改呢?
#8
zhaozhiwei2007-11-10 21:18
版主可在呀 , 发现问题了。
你的理解有误啊 要求是要查找参加了职工号为 “1002”的职工所参加的全部社会团体的职工号
你的测试数据不完整吧,
如果1002参加了两个团体或更多的话,
select a.职工号,a.姓名,a.年龄,性别=case when a.性别=1 then '男' else '女' end
from 职工 a,(select 编号 from 参加 where 职工号='1002') b,参加 c
where a.职工号=c.职工号 and b.编号=c.编号
这几句话的功能就是查找只要参加了 1002所参加的任意一个团体 的职工了,
而题目的意思是查找 那些参加了 1002所参加的全部团体 的职工
是不是?那该怎么改呢?
#9
purana2007-11-11 09:38
没错啊.
#10
zhaozhiwei2007-11-11 20:47
你试试再在你的参加表中让1002再添加一个社团,看看那结果怎样
在我的实验中怎么有错呢
#11
purana2007-11-11 20:51

create table 社会团体(
编号 int,
名称 varchar(60),
负责人 varchar(20),
活动地点 varchar(500)
)

insert into 社会团体 values(1,'红十字会','李明','广州天河区')
insert into 社会团体 values(2,'养老院义工','陈强','广州各区')

create table 参加(
职工号 varchar(6),
编号 int,
参加日期 datetime)

insert into 参加 values('1001',1,'2007-10-5')
--1002的参加了两个团体
insert into 参加 values('1002',1,'2007-10-5')
insert into 参加 values('1002',2,'2007-10-5')

insert into 参加 values('1003',2,'2007-10-5')
insert into 参加 values('1005',1,'2007-10-5')
insert into 参加 values('1008',2,'2007-10-5')
insert into 参加 values('1009',1,'2007-10-5')
insert into 参加 values('1010',2,'2007-10-5')

create table 职工(
职工号 varchar(6),
姓名 varchar(20),
年龄 smallint,
性别 bit --1表示男,0表示女
)

insert into 职工 values('1001','李伟',37,1)
insert into 职工 values('1002','赵天',22,1)
insert into 职工 values('1003','王容',27,0)
insert into 职工 values('1004','叶茜',31,0)
insert into 职工 values('1005','唐蓎',30,0)
insert into 职工 values('1006','方文',24,0)
insert into 职工 values('1007','曾强',34,1)
insert into 职工 values('1008','李静',22,0)
insert into 职工 values('1009','李媚媚',25,0)
insert into 职工 values('1010','何一',30,1)

select a.职工号,a.姓名,a.年龄,性别=case when a.性别=1 then '男' else '女' end
from 职工 a,(select 编号 from 参加 where 职工号='1002') b,参加 c
where a.职工号=c.职工号 and b.编号=c.编号

drop table 社会团体,参加,职工



--查出1002加参的团体的所有职工..有什么问题?
/*
1009 李媚媚 25 女
1001 李伟 37 男
1002 赵天 22 男
1005 唐蓎 30 女
1010 何一 30 男
1002 赵天 22 男
1003 王容 27 女
1008 李静 22 女
*/

#12
aubblove2007-11-12 11:58
我想他的意思是查找到和1002号职工参加社会团体一样的职工有哪些?
假如说1002参加了红十字会,又参加了养老院义工,而1005也参加了红十字会和养老院义工,其他职工都只有参加一中社会团体,那么查询的结果应该只有1005,不知道这是不是楼主的意思,还是我也理解错了
#13
DasayHaoEr2007-11-12 14:24

给个建议,下次字段名最好用英文的,汉字看得头都大了!

#14
zhaozhiwei2007-11-12 16:52
嗯 就像12楼的说得差不多,但是不全。
就是说要是1002参加了1号,2号社团,那么就查询这样的职工:
这些职工必须参加了1,2号社团,可以多参加其他社团。例如,1001参加了1,2,3号社团。1003参加了1,2号社团,而1004只参加了1号社团,那么就查出1001,1003号职工,而没有1004号职工。
不知道这样表达你有没有清楚我的意思?
昨天断网了,上不了,不好意思啊……
#15
缘吇弹2007-11-12 21:54
以下是引用DasayHaoEr在2007-11-12 14:24:34的发言:

给个建议,下次字段名最好用英文的,汉字看得头都大了!

纯英文的还算好看,要是拼音英文就更难看了.

#16
aubblove2007-11-13 08:51

惭愧呀,我也不会,请教版主吧,帮你顶!!

#17
taotao70802007-11-15 10:48
厉害~~
1