ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle开发 » 求个SQL语句

标题: 求个SQL语句
离线 david_liao
青鳥


精华贴数 2
个人空间 0
技术积分 1697 (990)
社区积分 120 (3110)
注册日期 2005-6-6
论坛徽章:4
会员2007贡献徽章授权会员ITPUB新首页上线纪念徽章生肖徽章:猪  
      

发表于 2006-9-28 13:59 
求个SQL语句

表A

partid        matid        partweight
ccc        cccc        1
bbb        bbbb        2
ddd        dddd        3
eee        eeee        4
fff        ffff        5

请问用什么语句可实现从表A到下面格式的显示,谢谢......

partid        matid partweight      test
ccc        cccc        1               1/1
bbb        bbbb        2               1/2
bbb        bbbb        2               2/2
ddd        dddd        3               3/3
ddd        dddd        3               1/3
ddd        dddd        3               2/3
eee        eeee        4               1/4
eee        eeee        4               2/4
eee        eeee        4               3/4
eee        eeee        4               4/4
fff        ffff        5               1/5
fff        ffff        5               2/5
fff        ffff        5               3/5
fff        ffff        5               4/5
fff        ffff        5               5/5




david_liao 上传了这个附件:
2006-9-28 13:59
bbbb.gif (6.52 KB)
 

__________________
臨淵羨魚,不如退而結網......禮之用,和爲貴......有志者,事競成,勵精圖治,百二秦關終屬楚。 苦心人,天不負,臥薪嘗膽,三千越甲可吞吳。香荷碧水动风凉,水动风凉夏日长,长日夏凉风动水,凉风动水碧荷香。
只看该作者    顶部
离线 xzh2000
仙人抚我须 结发授长生



精华贴数 13
个人空间 0
技术积分 46440 (14)
社区积分 5155 (286)
注册日期 2002-7-17
论坛徽章:30
现任管理团队成员ITPUB元老授权会员生肖徽章2007版:狗2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:帆船
生肖徽章2007版:虎ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星

发表于 2006-9-28 14:33 
14:33:29 SQL> select type,qty from test;

      TYPE        QTY
---------- ----------
         1          3
         1          6
         2          5
         2          9
         2          7

14:33:36 SQL> select type,qty,to_char(row_number() over(partition by type order by qty))||'/'||to_char(count(*) over(partition by type)) as cnt2 from test;

      TYPE        QTY CNT2
---------- ---------- ------------
         1          3 1/2
         1          6 2/2
         2          5 1/3
         2          7 2/3
         2          9 3/3


__________________
过目即忘  插柳成荫
只看该作者    顶部
离线 xzh2000
仙人抚我须 结发授长生



精华贴数 13
个人空间 0
技术积分 46440 (14)
社区积分 5155 (286)
注册日期 2002-7-17
论坛徽章:30
现任管理团队成员ITPUB元老授权会员生肖徽章2007版:狗2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:帆船
生肖徽章2007版:虎ITPUB新首页上线纪念徽章数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星

发表于 2006-9-28 15:01 


QUOTE:
最初由 xzh2000 发布
14:33:29 SQL> select type,qty from test;

      TYPE        QTY
---------- ----------
         1          3
         1          6
         2          5
         2          9
         2          7

14:33:36 SQL> select type,qty,to_char(row_number() over(partition by type order by qty))||'/'||to_char(count(*) over(partition by type)) as cnt2 from test;

      TYPE        QTY CNT2
---------- ---------- ------------
         1          3 1/2
         1          6 2/2
         2          5 1/3
         2          7 2/3
         2          9 3/3


没看清楚,不过这个用pl/sql应该很容易实现。。。


__________________
过目即忘  插柳成荫
只看该作者    顶部
离线 david_liao
青鳥


精华贴数 2
个人空间 0
技术积分 1697 (990)
社区积分 120 (3110)
注册日期 2005-6-6
论坛徽章:4
会员2007贡献徽章授权会员ITPUB新首页上线纪念徽章生肖徽章:猪  
      

发表于 2006-9-28 15:03 
楼主误会了

像楼主这样是很容易实现,现在的要求是如是INT 型栏位的值是2就要产生2行,test栏位的值分别是1/2,2/2,而如果是3就要产生3行,test栏位的值分别是1/3,2/3,3/3,而如果是100,就要产生100行,test栏位的值分别是1/100,2/100......99/100,100/100,而不是有2的栏位有3行才产生1/3,2/3,3/3


__________________
臨淵羨魚,不如退而結網......禮之用,和爲貴......有志者,事競成,勵精圖治,百二秦關終屬楚。 苦心人,天不負,臥薪嘗膽,三千越甲可吞吳。香荷碧水动风凉,水动风凉夏日长,长日夏凉风动水,凉风动水碧荷香。
只看该作者    顶部
离线 zhouwf0726
版主


精华贴数 5
个人空间 927
技术积分 7431 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员生肖徽章2007版:鸡
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:篮球BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠

发表于 2006-9-28 15:07 
SQL> SELECT * FROM TEST;

PARTID               MATID                                                                 PARTWEIGHT
-------------------- ------------------------------------------------------------ -------------------
ccc                  cccc                                                                           1
bbb                  bbbb                                                                           2
ddd                  dddd                                                                           3
eee                  eeee                                                                           4
fff                  ffff                                                                           5

SQL>
SQL> SELECT PARTID,MATID,ROW_NUMBER() OVER(PARTITION BY PARTWEIGHT ORDER BY ROWNUM)||'/'||PARTWEIGHT FROM(
  2  SELECT PARTID,MATID,PARTWEIGHT FROM TEST,
  3  (
  4  select substr(col,instr(col,',',1,rownum)+1,instr(col,',',1,rownum+1)-instr(col,',',1,rownum)-1) col from (
  5  select ',1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,' col from dual
  6  ) connect by rownum<length(translate(col,','||col,','))
  7  ) TEMP
  8  WHERE TEST.PARTWEIGHT = TEMP.COL
  9  )
10  ;

PARTID               MATID                                                        ROW_NUMBER()OVER(PARTITIONBYPA
-------------------- ------------------------------------------------------------ --------------------------------------------------------------------------------
ccc                  cccc                                                         1/1
bbb                  bbbb                                                         1/2
bbb                  bbbb                                                         2/2
ddd                  dddd                                                         1/3
ddd                  dddd                                                         2/3
ddd                  dddd                                                         3/3
eee                  eeee                                                         1/4
eee                  eeee                                                         2/4
eee                  eeee                                                         3/4
eee                  eeee                                                         4/4
fff                  ffff                                                         1/5
fff                  ffff                                                         2/5
fff                  ffff                                                         3/5
fff                  ffff                                                         4/5
fff                  ffff                                                         5/5

15 rows selected


__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
离线 zhouwf0726
版主


精华贴数 5
个人空间 927
技术积分 7431 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员生肖徽章2007版:鸡
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:篮球BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠

发表于 2006-9-28 15:09 
上边的这个按照如下规律实现:
partweight如果是n就会出现n条数据。

n支持的最大值靠维护sql中如下部分实现。
select ',1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,' col from dual


__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
离线 zhouwf0726
版主


精华贴数 5
个人空间 927
技术积分 7431 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员生肖徽章2007版:鸡
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:篮球BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠

发表于 2006-9-28 15:13 
其中构造temp表部分

select substr(col,instr(col,',',1,rownum)+1,instr(col,',',1,rownum+1)-instr(col,',',1,rownum)-1) col from (
select ',1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,' col from dual
) connect by rownum<length(translate(col,','||col,','))

可以参看以下地址:
http://www.itpub.net/showthread.php?threadid=626516


如果存在过大n值,可以考虑借助一个临时表来实现,先把n的值初始化。


__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
离线 david_liao
青鳥


精华贴数 2
个人空间 0
技术积分 1697 (990)
社区积分 120 (3110)
注册日期 2005-6-6
论坛徽章:4
会员2007贡献徽章授权会员ITPUB新首页上线纪念徽章生肖徽章:猪  
      

发表于 2006-9-28 15:13 
谢谢

对我的意思就是这样,我试试


__________________
臨淵羨魚,不如退而結網......禮之用,和爲貴......有志者,事競成,勵精圖治,百二秦關終屬楚。 苦心人,天不負,臥薪嘗膽,三千越甲可吞吳。香荷碧水动风凉,水动风凉夏日长,长日夏凉风动水,凉风动水碧荷香。
只看该作者    顶部
离线 zhouwf0726
版主


精华贴数 5
个人空间 927
技术积分 7431 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员生肖徽章2007版:鸡
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:篮球BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠

发表于 2006-9-28 15:24 
SQL> SELECT PARTID,MATID,ROW_NUMBER() OVER(PARTITION BY PARTWEIGHT ORDER BY ROWNUM)||'/'||PARTWEIGHT FROM(
  2  SELECT PARTID,MATID,PARTWEIGHT FROM TEST,
  3  (
  4  select substr(col,instr(col,',',1,rownum)+1,instr(col,',',1,rownum+1)-instr(col,',',1,rownum)-1) col from (
  5  select ',1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,' col from dual
  6  ) connect by rownum<length(translate(col,','||col,','))
  7  ) TEMP
  8  WHERE TEST.PARTWEIGHT = TEMP.COL
  9  )
10  order by rownum
11  ;

PARTID               MATID                                                        ROW_NUMBER()OVER(PARTITIONBYPA
-------------------- ------------------------------------------------------------ --------------------------------------------------------------------------------
ccc                  cccc                                                         1/1
bbb                  bbbb                                                         1/2
bbb                  bbbb                                                         2/2
ddd                  dddd                                                         1/3
ddd                  dddd                                                         2/3
ddd                  dddd                                                         3/3
eee                  eeee                                                         1/4
eee                  eeee                                                         2/4
eee                  eeee                                                         3/4
eee                  eeee                                                         4/4
fff                  ffff                                                         1/5
fff                  ffff                                                         2/5
fff                  ffff                                                         3/5
fff                  ffff                                                         4/5
fff                  ffff                                                         5/5

15 rows selected


给刚才的加个排序


__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
离线 pitter211
一般会员



精华贴数 0
个人空间 0
技术积分 313 (6288)
社区积分 0 (624491)
注册日期 2005-9-22
论坛徽章:1
生肖徽章2007版:鼠     
      

发表于 2006-9-28 15:34 
好帖 一条sql 语句实现如此多的功能。增长见识。


__________________
oracle is my wife and jsp is my lover,computer for me is all .
只看该作者    顶部
相关内容


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