需求:
表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