首页 > 数据库 > Oracle > Oracle中的二维表查询函数
| NAME | SEX | EXPENSEABILITY | DISTRICT |
| 张三 | 男 | 高消费 | 浦东新区 |
| 王强 | 男 | 高消费 | 浦东新区 |
| 马骏 | 男 | 中高消费 | 徐汇区 |
| 可乐 | 女 | 中等消费 | 闵行区 |
| SEX | EXPENSEABILITY | 闵行区 | 徐汇区 | 浦东新区 |
| 男 | 高消费 | 0 | 0 | 2 |
| 女 | 中等消费 | 1 | 0 | 0 |
| 男 | 中高消费 | 0 | 1 | 0 |
函数源码:
create or replace function GET_TWO_DIMENSIONAL_QUERY (TABLENAME in varchar2 ,P_X in varchar2 ,P_Y in varchar2)
return clob is
Result clob;
type curtype is ref cursor;
v_cur curtype;
v_BaseQuery varchar2(4000);
v_sqlstr varchar2(4000);
v_temp varchar2(4000);
begin
--获取group by 语句
v_BaseQuery:='(select '||P_X||','||P_Y||',count(*) num from ('||TABLENAME||') group by '||P_X||','||P_Y||')';
--选中Y轴字段
Result:='select '||P_Y||',';
--产生游标SQL
v_sqlstr :=' select distinct '||P_X||' from ('||v_BaseQuery||')';
--打开游标
open v_cur for v_sqlstr;
loop
fetch v_cur into v_temp;
exit when v_cur%notfound;
--判断值是否为空
if v_temp is null then
--产生X轴SQL
Result:=Result||'sum (case when '||P_X||' is null then num else 0 end) as "'||P_X||'为空'||'",';
Result:=Result||chr(13);
else
Result:=Result||'sum (case when '||P_X||'='''||v_temp||''' then num else 0 end) as "'||v_temp||'",';
Result:=Result||chr(13);
end if;
end loop;
--格式对齐
Result:=rtrim(Result,chr(13));
Result:=rtrim(Result,',');
Result:=Result||chr(13);
--将from字句与group by 子句加入
Result:=Result||'from '||v_BaseQuery||''||chr(13)||'group by '||P_Y||' ';
return Result;
end;
其实只是个代码生成函数,不过做报表用用还是挺方便的 ^_^
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22134244/viewspace-1024238/ ,如需转载,请注明出处,否则将追究法律责任。