使用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


你可能感兴趣的:(oracle,sql,Oracle)