首先说哈,我刚入oracle的门,迷糊中....要实现交叉表,网上找了很多通用的存储过程,如下一:
CREATE procedure procedure_across_table_b@TableName as varchar(50), --生成交叉表依据的表名@NewColumn as varchar(50), --生成表头依据的字段名@BeforeColumnName as varchar(50), --定义动态列开始名称@AfterColumnName as varchar(50), --定义动态列结束名称@GroupColumn as varchar(50), --分组依据的字段名@FirstColumnName as varchar(50), --定义第一列名称@StatColumn as varchar(50), --欲统计的字段名@SecondColumnName as varchar(50), --定义第二列名称@Operator as varchar(10) --统计的运算方式ASDECLARE @SQL as varchar(1000), @Column as varchar(50) --定义参数EXECUTE ('DECLARE cursor_new_column CURSOR FOR SELECT DISTINCT ' + @NewColumn + ' from ' + @TableName + ' for read only ') --定义游标begin SET nocount ON SET @SQL='select ' + @GroupColumn + ' as '+ @FirstColumnName + ', ' + @Operator + '(' + @StatColumn + ') AS [' + @SecondColumnName + ']' --定义SQL语句头 OPEN cursor_new_column while (0=0) BEGIN --遍历游标 FETCH NEXT FROM cursor_new_column INTO @Column --通过游标获取列头信息 if (@@fetch_status<>0) break SET @SQL = @SQL + ', ' + @Operator + '(CASE ' + @NewColumn + ' WHEN ''' + @Column + ''' THEN ' + @StatColumn + ' ELSE Null END) AS [' + @BeforeColumnName + @Column + @AfterColumnName + ']' --循环追加SQL语句 END SET @SQL = @SQL + ' from ' + @TableName + ' group by ' + @GroupColumn --定义SQL语句尾 EXECUTE(@SQL) --执行SQL语句 PRINT @SQL --输出SQL语句 IF @@error <>0 RETURN @@error --如果出错,则返回错误代码 CLOSE cursor_new_column --关闭游标 DEALLOCATE cursor_new_column RETURN 0 --释放游标,释放成功则返回0endGO但,怎么看,都不像是oracle的,倒像是sqlserver的,
我查资料找啊找啊,将语法转啊转啊的,还是失败....晕死我了!!
有哪位高人朋友帮帮忙,翻译成oracle的。谢谢谢谢。
能问问朋友们,不借用报表工具,就是手动编码实现分组统计以及动态交叉报表有什么好的方法?
要实现的动态交叉报表就是 作为行头的字段和作为列头的字段由用户自由选择
CREATE procedure procedure_across_table_b@TableName as varchar(50), --生成交叉表依据的表名@NewColumn as varchar(50), --生成表头依据的字段名@BeforeColumnName as varchar(50), --定义动态列开始名称@AfterColumnName as varchar(50), --定义动态列结束名称@GroupColumn as varchar(50), --分组依据的字段名@FirstColumnName as varchar(50), --定义第一列名称@StatColumn as varchar(50), --欲统计的字段名@SecondColumnName as varchar(50), --定义第二列名称@Operator as varchar(10) --统计的运算方式ASDECLARE @SQL as varchar(1000), @Column as varchar(50) --定义参数EXECUTE ('DECLARE cursor_new_column CURSOR FOR SELECT DISTINCT ' + @NewColumn + ' from ' + @TableName + ' for read only ') --定义游标begin SET nocount ON SET @SQL='select ' + @GroupColumn + ' as '+ @FirstColumnName + ', ' + @Operator + '(' + @StatColumn + ') AS [' + @SecondColumnName + ']' --定义SQL语句头 OPEN cursor_new_column while (0=0) BEGIN --遍历游标 FETCH NEXT FROM cursor_new_column INTO @Column --通过游标获取列头信息 if (@@fetch_status<>0) break SET @SQL = @SQL + ', ' + @Operator + '(CASE ' + @NewColumn + ' WHEN ''' + @Column + ''' THEN ' + @StatColumn + ' ELSE Null END) AS [' + @BeforeColumnName + @Column + @AfterColumnName + ']' --循环追加SQL语句 END SET @SQL = @SQL + ' from ' + @TableName + ' group by ' + @GroupColumn --定义SQL语句尾 EXECUTE(@SQL) --执行SQL语句 PRINT @SQL --输出SQL语句 IF @@error <>0 RETURN @@error --如果出错,则返回错误代码 CLOSE cursor_new_column --关闭游标 DEALLOCATE cursor_new_column RETURN 0 --释放游标,释放成功则返回0endGO但,怎么看,都不像是oracle的,倒像是sqlserver的,
我查资料找啊找啊,将语法转啊转啊的,还是失败....晕死我了!!
有哪位高人朋友帮帮忙,翻译成oracle的。谢谢谢谢。
能问问朋友们,不借用报表工具,就是手动编码实现分组统计以及动态交叉报表有什么好的方法?
要实现的动态交叉报表就是 作为行头的字段和作为列头的字段由用户自由选择
--给你个生成二维表的函数,以前用过的,还是很方便的/*====================函数描述=====================
功能:生成二维表查询语句
*/
function f_get_two_dimensional_query
(
tablename in varchar2, --表名或查询语句
p_x in varchar2, --X轴字段
p_y in varchar2 --Y轴字段
) return clob as 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;
--忘了改下开头的创建语句,我原来是放在package里的,你如果不放在package里,需改下:
function f_get_two_dimensional_query
改为:
create or replace function f_get_two_dimensional_query
之后我还试了试直接在前台实现,当然,后台也有部分代码一般交叉表要选择行字段、列字段和统计字段(即表格显示的数据)
先分别获取行头和列头要显示的数据集合(不重复)
再获取统计字段的所有数据,放在Map集合中,那么它的键为它所在的单元格的(行索引.列索引),只是一个标识而已,值为它的值。
最后,循环拼接出这个表格