首先说哈,我刚入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的。谢谢谢谢。
能问问朋友们,不借用报表工具,就是手动编码实现分组统计以及动态交叉报表有什么好的方法?
要实现的动态交叉报表就是 作为行头的字段和作为列头的字段由用户自由选择

解决方案 »

  1.   


    --给你个生成二维表的函数,以前用过的,还是很方便的/*====================函数描述=====================
    功能:生成二维表查询语句
    */
    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;
      

  2.   


    --忘了改下开头的创建语句,我原来是放在package里的,你如果不放在package里,需改下:
    function f_get_two_dimensional_query
    改为:
    create or replace function f_get_two_dimensional_query
      

  3.   

    2楼大哥,我引用了您给我的二维表函数,但是在ibatis的配置文件中出了问题,您能把您的配置信息贴给我看吗?非常感谢!
      

  4.   

    没有什么配置信息,我这里就是在存储过程中调用此函数,取出返回值,然后动态SQL去执行返回值中select语句
      

  5.   

    试试cube,可以考虑结合grouping使用
      

  6.   

    谢谢!
    之后我还试了试直接在前台实现,当然,后台也有部分代码一般交叉表要选择行字段、列字段和统计字段(即表格显示的数据)
    先分别获取行头和列头要显示的数据集合(不重复)
    再获取统计字段的所有数据,放在Map集合中,那么它的键为它所在的单元格的(行索引.列索引),只是一个标识而已,值为它的值。
    最后,循环拼接出这个表格