如果列有可能变化 ,比如 r5r6 r7........等, 那就要写个stored procedure, 要用动态方式实现。
我觉的表设计的不太合理, 造成开发复杂困难, 并且程序运行的效率非常低,没有意思!
如果基于你的目前数据, 可以用如下代码实现, 具体如下:
SQL> selectcol_name,
2
substr(str, instr(str, '-', 1, 1)+1, instr(str, '-', 1, 2)-instr(str, '-', 1, 1)-1) num,
3
substr(str, instr(str, '-', 1, 2)+1) cnt
4from
5(select decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') col_name,
6
case
7
when instr(a1.r1, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r1, 1, instr(a1.r1, '-', 1)-1) then
8
a1.r1
9
when instr(a1.r2, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r2, 1, instr(a1.r2, '-', 1)-1) then
10
a1.r2
11
when instr(a1.r3, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r3, 1, instr(a1.r3, '-', 1)-1) then
12
a1.r3
13
when instr(a1.r4, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r4, 1, instr(a1.r4, '-', 1)-1) then
14
a1.r4
15
else
16
null
17
end str
18from (select decode(sum(decode(r1, null, 0, 1)), 0, 'r1', 'r1'|| '-' || max(r1) || '-' || count(*)) r1,
19
decode(sum(decode(r2, null, 0, 1)), 0, 'r2', 'r2'|| '-' || max(r2) || '-' || count(*)) r2,
20
decode(sum(decode(r3, null, 0, 1)), 0, 'r3', 'r3'|| '-' || max(r3) || '-' || count(*)) r3,
21
decode(sum(decode(r4, null, 0, 1)), 0, 'r4', 'r4'|| '-' || max(r4) || '-' || count(*)) r4
22from dots) a1,
23(select rownum rn from dual connect by rownum <=4) b1);
COL_NAME NUMCNT
-------- ---------- ----------
r1
r2 1
6
r3
r4 4
6
[ 本帖最后由 bell6248 于 2009-8-12 15:19 编辑 ]
|