目前为止我所知道的好像1楼的是最好的方法了。 如果数据量大,可以对学科和姓名分别建立索引。不过一楼的好像有一个逻辑错误,那就是如果允许一个人选择两个科目的话,将得不到正确的结果。因此建议:增加一列子增列:ID (可作为主键) 对学科列进行排序 语句: select * from tb a where id in (select top 5 id from tb where 学科=a.学科) order by 学科,性别
如果有人可以选择一个以上的科目的话,你的要求只能用循环了。declare @sql varchar(8000) select @sql = isnull(@sql+' union ','') +'select top 5 * from tb where 性别= ''男'' and 科目 ='''+科目+'' union ' +'select top 5 * from tb where 性别= ''女'' and 科目 ='''+科目+'' ' from tb group by 科目 select @sql = 'select * from ('+@sql+') a order by 科目,性别' exec(@sql)
declare @sql varchar(8000) select @sql = isnull(@sql+' union ','') +'select top 5 * from tb where 性别= ''男'' and 科目 ='''+科目+''' union ' +'select top 5 * from tb where 性别= ''女'' and 科目 ='''+科目+''' ' from tb group by 科目 select @sql = 'select * from ('+@sql+') a order by 科目,性别' exec(@sql)
如果数据量大,可以对学科和姓名分别建立索引。不过一楼的好像有一个逻辑错误,那就是如果允许一个人选择两个科目的话,将得不到正确的结果。因此建议:增加一列子增列:ID (可作为主键)
对学科列进行排序
语句:
select * from tb a where id in (select top 5 id from tb where 学科=a.学科)
order by 学科,性别
select @sql = isnull(@sql+' union ','')
+'select top 5 * from tb where 性别= ''男'' and 科目 ='''+科目+'' union '
+'select top 5 * from tb where 性别= ''女'' and 科目 ='''+科目+'' '
from tb group by 科目
select @sql = 'select * from ('+@sql+') a order by 科目,性别'
exec(@sql)
select @sql = isnull(@sql+' union ','')
+'select top 5 * from tb where 性别= ''男'' and 科目 ='''+科目+''' union '
+'select top 5 * from tb where 性别= ''女'' and 科目 ='''+科目+''' '
from tb group by 科目
select @sql = 'select * from ('+@sql+') a order by 科目,性别'
exec(@sql)