ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 请教一sql

标题: [SQL] 请教一sql
离线 yyy16xx
mikk



来自 乌鲁木齐
精华贴数 0
个人空间 0
技术积分 137 (13201)
社区积分 7 (13756)
注册日期 2008-4-2
论坛徽章:1
2008北京奥运纪念徽章:赛艇     
      

发表于 2008-9-17 11:15 
请教一sql

环境 xp+9i
有一个销售表(业务员,产品,销售额)
003        c                       86
002        c                       76
004        c                       67
005      c                       76
006       c                        55
001        d                       95
002        d                       88
004        d                       82
003        d                       99
要得到按产品分组得到销售额前三名的业务员如
产品  第一                            第二                              第三
c       003 86               002 76,005 76                   004 67

这个第二 有2个(也有可能是多个)
这个sql怎么写


__________________
昨天,今天,明天!
只看该作者    顶部
离线 过过招
坚挺旗舰
Guiding Star


精华贴数 0
个人空间 0
技术积分 975 (1943)
社区积分 27 (6734)
注册日期 2005-6-10
论坛徽章:0
      
      

发表于 2008-9-17 11:20 
呵呵,又是一个行列转换。
每个产品对应的记录是不是不定?如果不定,必须用PL/SQL动态SQL拼凑~


__________________




只看该作者    顶部
离线 cosio
资深会员



精华贴数 0
个人空间 0
技术积分 1642 (1046)
社区积分 46 (5205)
注册日期 2004-8-8
论坛徽章:2
2008北京奥运纪念徽章:自行车ITPUB新首页上线纪念徽章    
      

发表于 2008-9-17 11:23 
动态的SQL,网上很多,可以找一下!
在不行到我的博客中找一下!


__________________
QQ:75558288
__________________
MSN:fenny_8@hotmail.com
__________________
Web:http://cosio.itpub.net
只看该作者    顶部
离线 lemonlau
学好oracle


来自 湖北---广东
精华贴数 1
个人空间 0
技术积分 673 (2890)
社区积分 14 (9370)
注册日期 2008-1-11
论坛徽章:1
2008北京奥运纪念徽章:羽毛球     
      

发表于 2008-9-17 11:39 
他的销售额肯定是个变量的 。。。
这样只能用动态sql去写。。


__________________
两年前有人问我erp是什么?我傻了。又问我sql是什么,我还是傻了。两年后我终于踏上了这条道路。
希望pub的朋友多多指教
只看该作者    顶部
离线 grubbyoo
▃▃,~


来自 夕阳小画
精华贴数 1
个人空间 6
技术积分 1682 (1035)
社区积分 349 (1789)
注册日期 2007-3-1
论坛徽章:15
2008北京奥运纪念徽章:皮划艇静水生肖徽章2007版:鸡2008北京奥运纪念徽章:射箭2008北京奥运纪念徽章:自行车2008北京奥运纪念徽章:手球2008北京奥运纪念徽章:射箭
      

发表于 2008-9-17 11:58 
create table test(seller varchar2(5),product varchar2(5),amt number)

insert into test values (003,'c',86);
insert into test values (002,'c',76);
insert into test values (004,'c',67);
insert into test values (005,'c',76);
insert into test values (006,'c',55);
insert into test values (001,'d',95);
insert into test values (002,'d',88);
insert into test values (004,'d',82);
insert into test values (003,'d',99);

select product  ,max(substr(sys_connect_by_path(seller||':'||amt,','),2)) keep (dense_rank last order by decode(rn,1,level,-1)) first,
                 max(substr(sys_connect_by_path(seller||':'||amt,','),2)) keep (dense_rank last order by decode(rn,2,level,-1)) sec,
                 max(substr(sys_connect_by_path(seller||':'||amt,','),2)) keep (dense_rank last order by decode(rn,3,level,-1)) third
from
(select a.*,dense_rank() over (partition by product order by amt desc ) rn,
            row_Number()  over (partition by product order by amt desc ) num
from test a ) a
connect by product=prior product
and    rn=  prior rn
and   num=prior num+1
group by product

product    first          sec           third
c        3:86        2:76,5:76        4:67
d        3:99        1:95        2:88


__________________
走到哪里才不是过客
只看该作者    顶部
离线 ysl_1981
南方小狼



精华贴数 0
个人空间 0
技术积分 84 (19646)
社区积分 1 (43275)
注册日期 2006-11-20
论坛徽章:0
      
      

发表于 2008-9-17 12:04 
Select 产品 ,decode(dn,1,业务员|| 销售额 )as 第一, 第二||decode(dn,2,业务员|| 销售额 )as 第二, decode(dn,3,业务员|| 销售额 )as 第三
From(Select  产品 ,业务员,销售额, dense_rank( )  over (prarttion by 业务员  order by 销售额 ) as  rn
From 销售表);


只看该作者    顶部
离线 yyy16xx
mikk



来自 乌鲁木齐
精华贴数 0
个人空间 0
技术积分 137 (13201)
社区积分 7 (13756)
注册日期 2008-4-2
论坛徽章:1
2008北京奥运纪念徽章:赛艇     
      

发表于 2008-9-17 13:04 
十分感谢大家!默拜grubbyoo中.........


__________________
昨天,今天,明天!
只看该作者    顶部
离线 lazyman2008



精华贴数 0
个人空间 0
技术积分 466 (4238)
社区积分 7 (13719)
注册日期 2007-11-19
论坛徽章:1
授权会员     
      

发表于 2008-9-17 13:33 
grubbyoo!牛!


只看该作者    顶部
离线 limangdu
初级会员


精华贴数 0
个人空间 0
技术积分 224 (8686)
社区积分 0 (1509279)
注册日期 2007-8-10
论坛徽章:0
      
      

发表于 2008-9-17 16:43 


QUOTE:
原帖由 grubbyoo 于 2008-9-17 11:58 发表
create table test(seller varchar2(5),product varchar2(5),amt number)

insert into test values (003,'c',86);
insert into test values (002,'c',76);
insert into test values (004,'c',67);
insert into test values (005,'c',76);
insert into test values (006,'c',55);
insert into test values (001,'d',95);
insert into test values (002,'d',88);
insert into test values (004,'d',82);
insert into test values (003,'d',99);

select product  ,max(substr(sys_connect_by_path(seller||':'||amt,','),2)) keep (dense_rank last order by decode(rn,1,level,-1)) first,
                 max(substr(sys_connect_by_path(seller||':'||amt,','),2)) keep (dense_rank last order by decode(rn,2,level,-1)) sec,
                 max(substr(sys_connect_by_path(seller||':'||amt,','),2)) keep (dense_rank last order by decode(rn,3,level,-1)) third
from
(select a.*,dense_rank() over (partition by product order by amt desc ) rn,
            row_Number()  over (partition by product order by amt desc ) num
from test a ) a
connect by product=prior product
and    rn=  prior rn
and   num=prior num+1
group by product

product    first          sec           third
c        3:86        2:76,5:76        4:67
d        3:99        1:95        2:88

高手!


只看该作者    顶部
在线/呼叫 newkid
资深新手
老程序员


来自 银河系
精华贴数 2
个人空间 0
技术积分 2756 (579)
社区积分 0 (121048)
注册日期 2004-6-26
论坛徽章:5
生肖徽章2007版:马生肖徽章2007版:鸡2008北京奥运纪念徽章:垒球2008北京奥运纪念徽章:羽毛球  
      

发表于 2008-9-18 00:32 
SELECT product
      ,MAX(DECODE(rn,1,performance))
      ,MAX(DECODE(rn,2,performance))
      ,MAX(DECODE(rn,3,performance))
  FROM (SELECT product
              ,rn
              ,wmsys.wm_concat(seller||':'||amt) AS performance
          FROM (SELECT a.*
                      ,dense_rank() over (partition by product order by amt desc ) rn
                  FROM test a
                ) a
         WHERE rn<=3
         GROUP BY product
              ,rn
        )
GROUP BY product;


grubbyoo用connect by简直是炉火纯青了,不过我还是要建议你加上 start with rn<=3 connect by product=prior product and rn<=3 减少不必要的运算!


__________________
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问