17,090
社区成员
发帖
与我相关
我的任务
分享
--如果t_fl表行数据不定的话可以写一个存储过程
CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
sqlstr VARCHAR2(4000) := '';
BEGIN
FOR cc IN (SELECT lb FROM t_fl) LOOP
sqlstr := sqlstr || 'sum(decode(lb,''' || cc.lb ||''',sl)) as "sl_'
|| cc.lb || '",';
END LOOP;
sqlstr := 'select id,' || rtrim(sqlstr,',') || ' from t_sj group by id';
OPEN o FOR sqlstr;
END row2col;
SQL> select id,sum(decode(lb,'a',sl)) sl_a,
2 sum(decode(lb,'b',sl)) sl_b,sum(decode(lb,'c',sl)) sl_c,
3 sum(decode(lb,'d',sl)) sl_d,sum(decode(lb,'e',sl)) sl_e
4 from t_sj group by id order by id;
ID SL_A SL_B SL_C SL_D SL_E
---------- ---------- ---------- ---------- ---------- ----------
1 10 30 40 50
2 20 50
SQL>
select id,max(decode(lb,'a',sl)) sl_a,
max(decode(lb,'b',sl)) sl_b,max(decode(lb,'c',sl)) sl_c,
max(decode(lb,'d',sl)) sl_d,max(decode(lb,'e',sl)) sl_e
from t_sj group by id order by id;