当前位置: 代码迷 >> Sql Server >> 这样的一个需求的SQL语句如何写啊
  详细解决方案

这样的一个需求的SQL语句如何写啊

热度:18   发布时间:2016-04-24 23:01:27.0
这样的一个需求的SQL语句怎么写啊??
一个表XMXXB,有字段XMID,一等奖票数,二等奖票数,三等奖票数。
现在要对这个表的数据进行排序,首先,按照每个项目一等奖得票数排序,排在最前面的是X个一等奖(X是从别的数据表读取来的个数),其次是Y个二等奖(注意,这里二等奖的顺序要求不是按照二等奖得票数,而是一二等奖得票数之和进行排序),最后是Z个三等奖(同理三等奖是按项目一二三等奖票数之和排序)。这里XYZ都是不一定的,都是从别的表里读取出来的

比如有5个项目,要求一等奖1个(X=1),2等奖2个(Y=2),三等奖3个(Z=3)
项目1 一等奖(3票)二等奖(3票)三等奖(4票)
项目2 一等奖(2票)二等奖(3票)三等奖(5票)
项目3 一等奖(2票)二等奖(4票)三等奖(4票)
项目4 一等奖(1票)二等奖(7票)三等奖(2票)
项目5 一等奖(1票)二等奖(3票)三等奖,7票)
则最终排序是:项目1,项目4,项目3,项目5,项目2

这样需求的sql语句该怎么写啊????

------解决方案--------------------
create table xmxxb ( xmid int,Class1 int,Class2 int,Class3 int)
insert into xmxxb values(1,3,3,4)
insert into xmxxb values(2,2,3,5)
insert into xmxxb values(3,2,4,4)
insert into xmxxb values(4,1,7,2)
insert into xmxxb values(5,1,3,7)
 
--一等奖1名 X=1
select * from (select top 1 * from xmxxb order by class1 desc) a 
union all
--二等奖2名 Y=2
select *from (select top 2 * from xmxxb   a where  not exists(select 1 from (
select top 1 * from xmxxb order by class1 desc) b where a.xmid=b.xmid)
order by class1+class2 desc )  b 
union all
--三等奖3名 Z=3
select *from ( 
select top 3 * from xmxxb  a where not exists (
select 1 from (select * from (select top 1 * from xmxxb order by class1 desc) a 
 union all
select *from (select top 2 * from xmxxb   a where  not exists(select 1 from (
select top 1 * from xmxxb order by class1 desc) b where a.xmid=b.xmid  
)
order by class1+class2 desc )  b  ) c   where a.xmid=c.xmid )
order by class1+class2+class3 desc
) c
也可以用临时表,SQL会简单些.
  相关解决方案