一个比较难的sql查询,请高手指教
有如下一个表,有如下字段(其它字段略)
活动名称 参加人
聚会 tom
聚会 ami
聚会 jan
聚会 haa
生日 tom
生日 jan
生日 jerry
开会 tom
开会 ami
开会 john
现在要用查询出3次活动都参加的人,这个sql怎么写,请高手指教。
注:不一定是3次活动,可能是有很多次,要求可以根据聚会名称来进行查询,比如说选择‘聚会’和‘生日’查询,即要查询出同时参加‘聚会’和‘生日’的人名单。
问题点数:100、回复次数:9Top
1 楼yjdn(人形机器)回复于 2005-06-03 13:47:27 得分 0
--不一定3次?那选出三次以上的可以没有?
select 参加人 from 表名 group by 参加人 having count(活动名称)>=3Top
2 楼yjdn(人形机器)回复于 2005-06-03 13:50:55 得分 40
做成一个存储过程吧,
select 参加人 from 表名 where 活动名称='聚会' or 活动名称='生日' group by 参加人 having count(活动名称)=活动数目
--这个条件参数应该是在程序中完成吧?你在程序中再生成一个活动数目就可以了Top
3 楼hsj20041004(光芒)回复于 2005-06-03 13:54:43 得分 0
select 参加人,活动名称 from 表名 where 活动名称 in ('yourname','yourname') group by 参加人 having count(*)>=3 order by count(*) desc
Top
4 楼hsj20041004(光芒)回复于 2005-06-03 13:56:26 得分 30
select 参加人 from 表名 where 活动名称 in ('yourname','yourname') group by 参加人 having count(*)>=3 order by count(*) descTop
5 楼yjdn(人形机器)回复于 2005-06-03 13:56:52 得分 0
或者写成过程
create proc proc_test
@tj varchar(8000),
@num int
as
declare @sql varchar(8000)
set @sql='select 参加人 from 表名 where '+@tj+' group by 参加人
having count(活动名称)='+@num
exec(@sql)
--这样的话,输入参数是类似“活动名称='聚会' or 活动名称='生日'”的条件,你要几个条件都可以,再加上一个活动数目就可以了,
这些在程序中生成应该没有问题吧Top
6 楼xluzhong(Ralph)回复于 2005-06-03 13:57:54 得分 15
select 参加人
from
(select distinct * from tablename)t
group by 参加人
having count(*)=(select count(distinct 活动名称) from tablename)Top
7 楼yjdn(人形机器)回复于 2005-06-03 13:59:03 得分 0
--在存在过程中,也可以得到活动数目,不过,我觉得这样的会降低速度,还是在程序中实现好点Top
8 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-06-03 13:59:52 得分 15
create table #t(活动名称 varchar(10),参加人 varchar(10))
insert into #t select '聚会','tom'
insert into #t select '聚会','ami'
insert into #t select '聚会','jan'
insert into #t select '聚会','haa'
insert into #t select '生日','tom'
insert into #t select '生日','jan'
insert into #t select '生日','jerry'
insert into #t select '开会','tom'
insert into #t select '开会','ami'
insert into #t select '开会','john'
select
参加人
from
#t
group by
参加人
having count(*) = (select count(distinct 活动名称) from #t)Top
9 楼leboo(良言)回复于 2005-06-03 20:12:02 得分 0
多谢各位,问题已经解决。 yjdn(无尽天空)和 hsj20041004(光芒)的方法我都试了,都可以。Top




