日期:2014-05-17  浏览次数:20849 次

Oracle动态查询列的问题
表A:
基金ID 基金名称 数量
1 教育 10
2 债券 11


表B:
银行ID 基金ID 银行名称
1 1 北京
2 1 上海
3 2 天津
4 2 北京
===============================================

要求查询类似下面的数据:
银行名称 教育数量 债券数量
北京 10 11
上海 10 0
天津 0 11


结果中列的除了第一列为“银行名称”是固定的之外,其他的都是动态的。

大家帮忙啊。。。。。。。。。。。着急中。。。。

------解决方案--------------------
v_sql:='select 银行名称';
FOR jj IN (select 基金ID ,基金名称, 数量 from 表a) LOOP
v_sql:=v_sql||','||' sum(decode(t.course, '''||jj.教育||''', score,0)) as '||jj.教育;
end loop;

v_sql:=v_sql|| ' from test_tb_grade t group by t.user_name'; 

------解决方案--------------------
/*
功能:交叉报表通用转换脚本(行转列)
日期:2011-03-01
备注:字段参数必须存在于表中,否则无法执行
sumField一定要是数字类型或者可以直接转换为数据类型
不直接执行查询,输出在DBMS内,将输出结果拷贝出来再执行即可
去掉头尾与存储过程相关的关键字,还原DECLARE、END和/**/注释,可直接做为脚本使用
*/
create procedure pr_crossReport(strTable in varchar2,firstField in varchar2,secondField in varchar2,sumField in varchar2)
as 
--declare
/*
strTable varchar2(50) := 'hi_dataValue';
firstField varchar2(20) := 'indCode';
sumField varchar2(50) := 'indValue';
secondField varchar2(50) := 'varCode';
*/
--32767为长度上限
strCursorSql varchar2(32700) := '';
--游标相关
TYPE myref IS REF CURSOR;
cur myref;
secondFieldValue varchar2(50) := '';
i int := 0;
begin
strCursorSql := 'select distinct ' || secondField || ' from ' || strTable;
OPEN cur FOR strCursorSql;
strCursorSql := '';
i := 0;
loop
Fetch cur into secondFieldValue;
Exit when cur%notfound;
i := i + 1;
strCursorSql := strCursorSql ||'
sum(case when ' || secondField || ' = ''' || secondFieldValue || ''' then ' || sumField || 
' else 0 end) as F_' || substr(secondFieldValue, 1, 12)/*列名只截取12个字符长度*/ || ',';
if (i > 10 or length(strCursorSql) > 32000) then 
dbms_output.put_line('可选分类过多,无法进行完整转换');
exit;
end if;
end loop;
--表名以及分组语法
strCursorSql := 'select ' || firstField || ', ' || 
substr(strCursorSql, 1, length(strCursorSql) - 1) || 
' from ' || strTable || ' group by ' || firstField ;
--返回最终交叉报表转换语法
dbms_output.put_line(strCursorSql);
--end;
end pr_crossReport;