日期:2014-05-19  浏览次数:20441 次

问条sql语句的问题.越简单越好.
Id         科目       成绩
1         语文         60
2         数学         85
3         语文         85
4         英语         96
5         化学         77
6         英语         50
7         物理         90
8         英语         85
列出最大前3不同分数的3条记录。比如96,90,85,但是有两条85的话要显示两条。显示的条数就是4条

------解决方案--------------------
select * from T
where 成绩 in (select top 3 成绩 from T group by 成绩 order by 成绩 desc)
------解决方案--------------------
create table t(id int,科目 nvarchar(20),成绩 int)
insert into t(id,科目,成绩)
select 1, '语文 ',60 union all
select 2, '数学 ',85 union all
select 3, '语文 ',85 union all
select 4, '英语 ',96 union all
select 5, '化学 ',77 union all
select 6, '英语 ',50 union all
select 7, '物理 ',90 union all
select 8, '英语 ',85

select * from t where 成绩 in(select top 3 成绩 from t group by 成绩 order by 成绩 desc) order by 成绩 desc

drop table t
------解决方案--------------------
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(Id int,科目 varchar(10),成绩 int)
insert into tb(Id,科目,成绩) values(1, '语文 ', '60 ')
insert into tb(Id,科目,成绩) values(2, '数学 ', '85 ')
insert into tb(Id,科目,成绩) values(3, '语文 ', '85 ')
insert into tb(Id,科目,成绩) values(4, '英语 ', '96 ')
insert into tb(Id,科目,成绩) values(5, '化学 ', '77 ')
insert into tb(Id,科目,成绩) values(6, '英语 ', '50 ')
insert into tb(Id,科目,成绩) values(7, '物理 ', '90 ')
insert into tb(Id,科目,成绩) values(8, '英语 ', '85 ')
go


select * from
(
SELECT *,Place=(SELECT COUNT(DISTINCT 成绩) FROM tb WHERE 成绩 > = a.成绩)
FROM tb a
) t
where place <= 3
ORDER BY 成绩 desc

drop table tb
/*
Id 科目 成绩 Place
----------- ---------- ----------- -----------
4 英语 96 1
7 物理 90 2
2 数学 85 3
3 语文 85 3
8 英语 85 3

(所影响的行数为 5 行)
*/