使用Instr, Substr, WMSYS.WM_CONCA 做有限数目的行转列


需求:


表T_TMP_ABC

 ITEM_ID FUND_NAME RATE
-------- --------- ----
     123 AB        0.30
     123 AC        0.20
     123 AF        0.50
     456 AC        0.20
     456 AF        0.80


期待结果

 ITEM_IDFUND_1    RATE_1  FUND_2    RATE_2 FUND_3    RATE_3  FUND_4    RATE_4
-------- --------- ------  --------- ------  --------- ------ --------- ------
     123      AB         0.30             AC          0.20                AF          0.50
     456     AC          0.20             AF          0.80



限定只有3个Fund,则SQL如下:

select item_id,

      (case INSTR(fundRate, '@', 1, 1)

        when0then

         ' '

        else

         substr(fundRate, 0, INSTR(fundRate, '@', 1, 1) - 1)

       end) as fund_1,

      (case INSTR(fundRate, '@', 1, 1)

        when0then

         ' '

        else

         substr(fundRate,

                INSTR(fundRate, '@', 1, 1) + 1,

                INSTR(fundRate, ',', 1, 1) - INSTR(fundRate, '@', 1, 1) - 1)

       end) as rate_1,

      (case INSTR(fundRate, '@', 1, 2)

        when0then

         '  '

        else

         substr(fundRate,

                INSTR(fundRate, ',', 1, 1) + 1,

                INSTR(fundRate, '@', 1, 2) - INSTR(fundRate, ',', 1, 1) - 1)

       end) as fund_2,

      (case INSTR(fundRate, '@', 1, 2)

        when0then

         ' '

        else

         substr(fundRate,

                INSTR(fundRate, '@', 1, 2) + 1,

                INSTR(fundRate, ',', 1, 2) - INSTR(fundRate, '@', 1, 2) - 1)

       end) as rate_2,

      (case INSTR(fundRate, '@', 1, 3)

        when0then

         ' '

        else

         substr(fundRate,

                INSTR(fundRate, ',', 1, 2) + 1,

                INSTR(fundRate, '@', 1, 3) - INSTR(fundRate, ',', 1, 2) - 1)

       end) as fund_3,

      (case INSTR(fundRate, '@', 1, 3)

        when0then

         ' '

        else

         substr(fundRate,

                INSTR(fundRate, '@', 1, 3) + 1,

                INSTR(fundRate, ',', 1, 3) - INSTR(fundRate, '@', 1, 3) - 1)

       end) as rate_3

  from (select t.item_id,

             (WMSYS.WM_CONCAT(t.fund_name || '@' || t.rate)  || ',' ) as fundRate

         from t_tmp_abc t

        groupby t.item_id);


注意,为了完整检索,在字符串最后补了一个‘,’:(WMSYS.WM_CONCAT(t.fund_name || '@' || t.rate)  || ','


相关:

1) Instr

在Oracle中,可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符。其语法为:
    instr(sourceString,destString,start,appearPosition).
   其中sourceString代表源字符串;destString代表想聪源字符串中查找的子串;start代表查找的开始位置,该参数可选的,默认为1;appearPosition代表想从源字符中查找出第几次出现的destString,该参数也是可选的,默认为1;
    如果start的值为负数,那么代表从右往左进行查找。
    返回值为:查找到的字符串的位置。


2)Substr

substr函数有三个参数,允许你将目标字符串的一部份输出,

第一个参数为目标字符串,

第二个字符串是将要输出的子串的起点,

第三个参数是将要输出的子串的长度。


3)WMSYS.WM_CONCAT

                结合Group By,连接字符串

                简单介绍:http://blog.csdn.net/psyuhen/article/details/7492460


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值