CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

行转列求一sql(100分奉上,在线等,得正解立刻给分)!!!

楼主xzy825(小菜鸟)2006-08-18 16:21:39 在 Oracle / 开发 提问

表A:pk为a1;  
  a1(工资项编号),a2(工资项名称),a3(工资类别)  
  -------------------------------------------  
  a001                           基本工资                 00  
  a002                           饭补                         00  
  a003                           奖金                         01  
  a004                           绩效工资                 01  
  a005                           所得税                     02        
   
  表B:pk为b1,a1;  
  a1(工资项编号),b1(编号),           b2(金额)  
  -------------------------------------------  
  a001                         b001                         50  
  a002                         b002                         50  
  a003                         b003                         100  
  a005                         b004                         -40  
   
  结果:注:a3(工资类别)只能有00,01,03这三种。  
   
  类别一(00)                           类别二   (02)                                 类别三(03)  
  ----------------------------------------------------------------  
  基本工资50,饭补50                 绩效工资100                                       所得税-40  
   
  请问这个sql怎么写?  
  问题点数:100、回复次数:21Top

1 楼xzy825(小菜鸟)回复于 2006-08-18 16:31:50 得分 0

问个问题oracle中如何把某一列(varchar型)的结果连接起来组成一个新字符串?Top

2 楼sxykje(我爱老婆)回复于 2006-08-18 16:34:38 得分 0

column1   ||   column2连接Top

3 楼xzy825(小菜鸟)回复于 2006-08-18 16:36:36 得分 0

楼上的大哥不是把两列连到一起,是把一列中的若干行连到一起。Top

4 楼feng2(蜀山风云)回复于 2006-08-18 17:49:15 得分 0

类别一(00)                           类别二   (02)                                 类别三(03)  
  ----------------------------------------------------------------  
  基本工资50,饭补50                 绩效工资100                                       所得税-40  
   
  这里的类别有些混乱吧?  
   
  还有,类别二得到的结果是“奖金100”而不是“绩效工资100”,是么?  
   
  要实现这个逻辑,重要的是使用以下2个函数:  
  sys_connect_by_path()和row_number()over()  
  剩下的自己做做看。Top

5 楼wiler(@_@)回复于 2006-08-20 17:29:04 得分 0

1.写一个函数  
      create   or   replace   function   GetString(gz_type   varchar2)   return   varchar2   is  
        Result   varchar2(2000);  
        v_Str   varchar2(200);  
        cursor   c_Str   is    
          select   A.a2||B.b2   from   A   ,   B  
          where   A.a1=B.a1   and   A.a3=gz_type;  
      begin  
          Result   :='   ';  
          open   c_table;  
           
          loop  
                  fetch   c_Str   into   v_Str;  
                   
                  exit   when   c_Str%NOTFOUND;  
                   
                  Result   :=   Result||v_Str;  
          end   loop;  
          close   c_table;  
          return(Result);  
      end   GetString;  
  2.select   GetString('00')   "类别一(00)",GetString('01')   "类别二(02)",GetString('03')   "类别三(03)"   from   dualTop

6 楼dawugui(潇洒老乌龟)回复于 2006-08-20 17:32:52 得分 0

0047   --   SQL语句之合并行列转换  
   
    有表rowtocol,其数据如下:  
    a   b  
    1   1  
    1   2  
    1   3  
    2   1  
    2   2  
    3   1  
    如何转换成如下结果:  
    a   b  
    1   1,2,3  
    2   1,2  
    3   1    
   
    创建一个合并的函数         
   
    create   function   f_rowtocol(@a   int)  
    returns   varchar(8000)  
    as  
    begin  
     declare   @str   varchar(8000)  
     set   @str   =   ''  
     select   @str   =   @str   +   ','   +   cast(b   as   varchar)   from   rowtocol   where   a   =   @a    
     set   @str   =   right(@str   ,   len(@str)   -   1)  
     return(@str)  
    End  
    go  
   
   
    调用自定义函数得到结果:  
    select   distinct   a   ,dbo.f_rowtocol(a)   from   rowtocol    
  Top

7 楼dawugui(潇洒老乌龟)回复于 2006-08-20 17:33:20 得分 0

0046   --   SQL语句之普通行列转换  
   
  假设有张学生成绩表(tb_rowtocol)如下  
  Name   Subject   Result  
  张三   语文  73  
  张三   数学  83  
  张三   物理  93  
  李四   语文  74  
  李四   数学  84  
  李四   物理  94  
   
  想变成    
  姓名   语文   数学   物理  
  张三   73  83  93  
  李四   74  84  94  
   
  declare   @sql   varchar(4000)  
  set   @sql   =   'select   Name   as   '   +   '姓名'  
  select   @sql   =   @sql   +   '   ,   sum(case   Subject   when   '''+Subject+'''   then   Result   end)   ['+Subject+']'  
  from   (select   distinct   Subject   from   rowtocol)   as   a  
  set   @sql   =   @sql   +   '   from   rowtocol   group   by   name'  
  exec(@sql)    
   
  如果上述两表互相换一下:即  
  表名(cj)  
  姓名   语文   数学   物理  
  张三   73  83  93  
  李四   74  84  94  
   
  想变成    
   
  Name   Subject   Result  
  张三   语文  73  
  张三   数学  83  
  张三   物理  93  
  李四   语文  74  
  李四   数学  84  
  李四   物理  94  
   
  select   姓名   as   Name,'语文'   as   Subject,语文   as   Result   from   CJ   union  
  select   姓名   as   Name,'数学'   as   Subject,数学   as   Result   from   CJ   union  
  select   姓名   as   Name,'物理'   as   Subject,物理   as   Result   from   CJ  
  order   by   姓名   desc    
  Top

8 楼Eric_1999(╙@^@╜)回复于 2006-08-21 08:42:27 得分 0

搂主的意思是把三个类型的b2加起来吧??  
   
  还要把两列合并吗?说清楚点吧。Top

9 楼smilingchen(钝哥)回复于 2006-08-21 10:26:36 得分 0

关注Top

10 楼xzy825(小菜鸟)回复于 2006-08-21 11:53:12 得分 0

除了使用存储过程,用sql写不出来吗?Top

11 楼xzy825(小菜鸟)回复于 2006-08-21 11:56:11 得分 0

更正一下,类型那个地方错了。  
  表A:pk为a1;  
  a1(工资项编号),a2(工资项名称),a3(工资类别)  
  -------------------------------------------  
  a001                           基本工资                 00  
  a002                           饭补                         00  
  a003                           奖金                         01  
  a004                           绩效工资                 01  
  a005                           所得税                     02        
   
  表B:pk为b1,a1;  
  a1(工资项编号),b1(编号),           b2(金额)  
  -------------------------------------------  
  a001                         b001                         50  
  a002                         b002                         50  
  a003                         b003                         100  
  a005                         b004                         -40  
   
  结果:注:a3(工资类别)只能有00,01,02这三种。  
   
  类别一(00)                           类别二   (01)                                 类别三(02)  
  ----------------------------------------------------------------  
  基本工资50,饭补50                 绩效工资100                                       所得税-40  
   
  请问这个sql怎么写?  
   
  Top

12 楼feng2(蜀山风云)回复于 2006-08-21 14:54:53 得分 0

SQL>   select   *   from   a;  
   
  ITEM_NO   ITEM_SUB_NO   ITEM_NAME  
  -------   -----------   --------------------  
  a001         基本工资         00  
  a002         饭补                 00  
  a003         奖金                 01  
  a004         绩效工资         01  
  a005         所得税             02  
   
  SQL>   select   *   from   b;  
   
  ITEM_NO   ITEM_SUB_NO   ITEM_CODE  
  -------   -----------   --------------------  
  a001         b001                 50  
  a002         b002                 50  
  a003         b003                 100  
  a005         b004                 -40  
   
   
  select   max(A)   "类别一(00)",max(B)   "类别二(01)",max(C)   "类别三(02)"   from(  
  select   case   when   item_name   =   '00'   then   k   end   A,  
  case   when   item_name   =   '01'   then   k   end   B,  
  case   when   item_name   =   '02'   then   k   end   C  
  from  
  (  
  select   item_name,substr(replace(max(sys_connect_by_path(code,',')),',',','),2)   K  
  from  
  (  
  select   t.*,row_number()over(partition   by   item_name   order   by   item_name)   rn    
  from    
  (select   a.item_name,a.item_sub_no||b.item_code   code   from   a,b   where   a.item_no=b.item_no)   t  
  )  
  start   with   rn=1  
  connect   by   rn   =   prior   rn+1  
  and   item_name   =   prior   item_name  
  group   by   item_name  
  )  
  )  
  ;  
   
  类别一(00)                               类别二(01)                               类别三(02)  
  --------------------------   --------------------------   ---------------------------------------  
  基本工资50,饭补50                     奖金100                                         所得税-40Top

13 楼feng2(蜀山风云)回复于 2006-08-21 14:57:14 得分 0

select   substr(max(A),1,20)   "类别一(00)",substr(max(B),1,20)   "类别二(01)",substr(max(C),1,20)   "类别三(02)"   from  
  .....  
   
  类别一(00)                   类别二(01)                   类别三(02)  
  --------------------   --------------------   --------------------  
  基本工资50,饭补50         奖金100                             所得税-40  
   
  SQL>Top

14 楼licsth(北京三毛)回复于 2006-08-21 17:10:50 得分 0

这种要求,写成一个sql真是要命;笨招是建立每种   表A.工资项名称   的子表、每种表B.编号||表B.金额,之后几层嵌套+decode下来;稍微聪明点的就是‘feng2(蜀山风云)   ’那种高深的sql了;  
  建议:后台代码判断,而非sql完成,这么复杂的逻辑分支搞个研究试试还可以,作实际项目有点本本了!Top

15 楼licsth(北京三毛)回复于 2006-08-21 17:11:46 得分 0

追加:lz不要给我分了!Top

16 楼utilities(幸福一生)回复于 2006-08-21 20:06:56 得分 0

select   count(*),sum(decode(useid,1,1,0))   useid1,  
  sum(decode(useid,2,1,0))   useid2,  
  sum(decode(useid,3,1,0))   useid3,  
  sum(decode(twouseid,1,1,0))   twouseid1,  
  sum(decode(twouseid,2,1,0))   twouseid2,  
  sum(decode(twouseid,3,1,0))   twouseid3  
  from   table1    
  group   by   ordid  
  Top

17 楼Eric_1999(╙@^@╜)回复于 2006-08-22 08:53:57 得分 0

行列转换  
      select     name,sum(decode(course,'语文',   grade,null))   "语文",    
                                sum(decode(course,'数学',   grade,null))   "数学",    
                                sum(decode(course,'英语',   grade,null))   "英语"    
      from   student    
      group   by   name  
  --不定列转换  
                    C1   C2  
  ----------   ----------  
                    1   我  
                    1   是  
                    1   谁  
                    2   知  
                    2   道  
                    3   不Top

18 楼Eric_1999(╙@^@╜)回复于 2006-08-22 09:41:38 得分 0

应该是这样。  
   
  select     sum(decode(b2,'00',   grade,null))   "类别一(00)",    
                  sum(decode(b2,'01',   grade,null))   "类别二(01)",    
                  sum(decode(b2,'02',   grade,null))   "类别三(02)"    
      from     A   ,   B  
    where     A.a1   =   B.a1(+)  
    group     A.a3Top

19 楼Eric_1999(╙@^@╜)回复于 2006-08-22 09:43:54 得分 0

不好意思,写错了。下面的才是。  
   
  select     sum(decode(a3,   '00',   B.b2,   null))   "类别一(00)",    
                  sum(decode(a3,   '01',   B.b2,   null))   "类别二(01)",    
                  sum(decode(a3,   '02',   B.b2,   null))   "类别三(02)"    
      from     A   ,   B  
    where     A.a1   =   B.a1(+)  
    group     A.a3  
  Top

20 楼chenquan(逍遥无忌)回复于 2006-08-22 16:59:46 得分 0

类似方法,参考:   utilities(幸福一生)Top

21 楼LinZhongBao(【豹哥】)回复于 2006-08-22 23:12:53 得分 0

哦,不错Top

相关问题

关键词

得分解答快速导航

  • 帖主:xzy825

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo