日期:2014-05-18  浏览次数:20686 次

求数据交叉显示的储存过程
产品名称 类别 佣金
产品1 1 6
产品2 2 3
产品3 1 5
产品4 1 1
产品5 1 9
产品6 2 5
产品7 2 3
产品8 1 100
产品9 1 56
产品10 2 40
产品11 1 22
产品12 1 33
产品13 2 22
产品14 1 9
产品15 1 81
产品16 1 65

请教各位:现在想类别2显示1条然后类别1显示2条,类别2显示1条然后类别1显示2条.....显示是按照各自佣金由高到低。 存储过程应该怎么写?

------解决方案--------------------
--sql 2000如下,2005把里面的子查询改为row_number即可.
SQL code
create table tb(产品名称 varchar(10),类别 int,佣金 int)
insert into tb values('产品1'  ,1 ,6)
insert into tb values('产品2'  ,2 ,3)
insert into tb values('产品3'  ,1 ,5)
insert into tb values('产品4'  ,1 ,1)
insert into tb values('产品5'  ,1 ,9)
insert into tb values('产品6'  ,2 ,5)
insert into tb values('产品7'  ,2 ,3)
insert into tb values('产品8'  ,1 ,100)
insert into tb values('产品9'  ,1 ,56)
insert into tb values('产品10' ,2 ,40)
insert into tb values('产品11' ,1 ,22)
insert into tb values('产品12' ,1 ,33)
insert into tb values('产品13' ,2 ,22)
insert into tb values('产品14' ,1 ,9)
insert into tb values('产品15' ,1 ,81)
insert into tb values('产品16' ,1 ,65)
go

select 产品名称 ,类别 ,佣金 from
(
  select t.*, 
  case when 类别 = 2 then ((select count(1) from tb where 类别 = 2 and (佣金 > t.佣金 or (佣金 = t.佣金 and 产品名称 < t.产品名称))) + 1) - 1 
       when 类别 = 1 then (((select count(1) from tb where 类别 = 1 and (佣金 > t.佣金 or (佣金 = t.佣金 and 产品名称 < t.产品名称))) + 1) - 1)/2
  end px1 from tb t
) m
order by px1 , 类别 desc , 佣金 desc

drop table tb

/*
产品名称       类别          佣金          
---------- ----------- ----------- 
产品10       2           40
产品8        1           100
产品15       1           81
产品13       2           22
产品16       1           65
产品9        1           56
产品6        2           5
产品12       1           33
产品11       1           22
产品2        2           3
产品5        1           9
产品14       1           9
产品7        2           3
产品1        1           6
产品3        1           5
产品4        1           1

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