insert into TEST values ('王强','男','高消费','浦东新区');
insert into TEST values ('马骏','男','中高消费','徐汇区');
insert into TEST values ('可乐','女','中等消费','闵行区');
commit;
NAME | SEX | EXPENSEABILITY | DISTRICT |
张三 | 男 | 高消费 | 浦东新区 |
王强 | 男 | 高消费 | 浦东新区 |
马骏 | 男 | 中高消费 | 徐汇区 |
可乐 | 女 | 中等消费 | 闵行区 |
sum (case when district='徐汇区' then num else 0 end) as "徐汇区",
sum (case when district='浦东新区' then num else 0 end) as "浦东新区"
from (select district,sex,expenseability,count(*) num from (TEST) group by district,sex,expenseability)
group by sex,expenseability
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博客 ” ,链接:http://blog.itpub.net/22134244/viewspace-1024238/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22134244/viewspace-1024238/