使用 CSV 文件可以吗?也许你的例子简单了点,可以用SQL就能实现例如
SELECT 部门,
       SUM(DECODE(性别,'男',1,0))  MAN,
       SUM(DECODE(性别,'女',1,0))  WOMAN,
       SUM(DECODE(学历,'大学',1,0))  DXUE,
       SUM(DECODE(学历,'本科',1,0))  BENKE
GROUP BY 部门
WHERE .......这只是对你的说明写的CURSOR 然后将数据,写到文件就可以了,不知道你的具体情况,所以不能给你更好的办法。

解决方案 »

  1.   

    严重同意hqwang77(haiqing) 的写法
      

  2.   

    来自一楼:
    SELECT 部门,
           SUM(DECODE(性别,'男',1,0))  MAN,
           SUM(DECODE(性别,'女',1,0))  WOMAN,
           SUM(DECODE(学历,'大学',1,0))  DXUE,
           SUM(DECODE(学历,'本科',1,0))  BENKE
    GROUP BY 部门        <----放到后面
    WHERE .......
    --很好的解决方法,只是应该把    GROUP BY 部门   放到where 的后面
      

  3.   

    楼主呀,问题简化了,答案同样也简化了呀。一条sql语句就可以了。
    你还是不要偷懒,把问题叙述清楚。不然怎么得到真正的答案呀。
      

  4.   

    是我没有把问题说清楚
    实际情况并不是可以用一个GROUP BY 就可以分出来的
    统计的每个单元格实际上都需要用一个比较复杂的查询语句才可以得到结果
    并且查询的条件没有规律可言。在Oracle的存储过程中大体是这样的
    CREATE OR REPLACE FUNCTION func_test(p_class VARCHAR2)
    RETURN NUMBER IS
    V_001 NUMBER;
    V_002 NUMBER;
    V_003 NUMBER;
    .........
    BEGIN
      SELECT COUNT(*) INTO V_001 FROM 表 WHERE 条件1 AND 条件2 AND 条件3;
      SELECT COUNT(*) INTO V_002 FROM 表 WHERE 条件2 AND 条件4 AND 条件5;
      SELECT COUNT(*) INTO V_003 FROM 表 WHERE 条件1 AND 条件3 AND 条件6;
      ......
      RETURN V_001;
      ......
    END;这样将统计的数据作为输出变量返回
    可问题是会有很多这样的变量,能不能将输出参数变为一个二维数组,一并返回
    当然最好是直接写道一个XML文件里(不知道可行否),做为二进制文件进行存取。
      

  5.   

    在Oracle的存储过程中大体是这样的
    CREATE OR REPLACE FUNCTION func_test(p_class VARCHAR2)
    RETURN NUMBER IS
    ...返回一个数字,不大明白你的意思.
      

  6.   

    hqwang77(haiqing)已经说了,一个语句可以搞定,不用什么存储过程
      

  7.   

    搂主,是要返回把表格转换成xml的字符串吗?
    procedure xmltest(p_name users.name%type,buff out varchar2) as
    vid users.id%type;
    vname users.name%type;
    doc xmldom.domdocument;
    mainNode xmldom.domnode;
    rootNode xmldom.domnode;
    rootElem xmldom.domelement;
    dataNode xmldom.domnode;
    dataElem xmldom.domelement;
    txtElem xmldom.domtext;
    txtNode xmldom.domnode;
    cursor vusers is
    select id,name from users where name=xmltest.p_name; 
    begin
      doc := xmldom.newdomdocument();
      mainnode := xmldom.makenode(doc);
      rootElem := xmldom.createelement(doc,'Users');
      rootNode := xmldom.appendchild(mainnode,xmldom.makenode(rootElem));
      open vusers;
      loop
        fetch vusers into vid,vname;
        exit when vusers%notfound;
        dataElem := xmldom.createelement(doc,'add');
        dataNode := xmldom.makenode(dataElem);
        xmldom.setattribute(dataElem,'ID',vid);
        xmldom.setattribute(dataElem,'name',vname);
        dataNode := xmldom.Appendchild(rootNode,dataNode);
        txtElem := xmldom.createtextnode(doc,'');
        txtNode := xmldom.appendchild(dataNode,xmldom.makenode(txtElem));
      end loop;
      close vusers;
      commit;
      xmldom.Writetobuffer(doc,buff);
      xmldom.freedocument(doc);    
    end xmltest;
    格式大概这样,具体的数据,你自己替换就可以了
      

  8.   

    又是个交叉表问题。。昨天花了一天。。做了个解决这样问题的接口和类。。我用.net做的..............搬个板凳..看你们怎么实现....
      

  9.   

    我说说我在.net里面实现的方法吧...给你点启发...先把你要处理的数据取出来...放在一个datatable里面..(其实..datatable和xml是一样的)..用个dataadaper fill进去..
    然后..断开数据库连接...然后...先根据表的情况..生产一个新的datable..先创建结构..然后..在把数据添进去...我用接口...没有定义返回类型..不定义输入的参数的类型和情况..然后...用接口继承...创建一个类..处理这个咚咚...返回一个datatable...(为了通用和复用)...我为了这样的动态交叉报表郁闷了3天..在oracle里面没有解决..所以..在.net里面做了...其实..我的pl/sql不是很熟悉...我觉得...在数据库里面也能实现..但是..从..软件工程的角度出发..你最好不要写在数据库里面...不利于复用和移植....本人比较菜...看高手出招...呵呵
      

  10.   

    sfc1234(jim)和JKKKK(一辈子郁闷) 的意思对路了我在琢磨琢磨因为我的统计量会很大,放在数据表例每次都更新这样的频繁操作会不会影响到效率?
      

  11.   

    感谢大家的关注我的问题可能是有一些另类。那么在简化一些,不用二维数组也不用XML了
    假设我用一个结果表(物理的)来存储检索结果,该如何插入呢?只能用UPDATE么?
    CREATE OR REPLACE FUNCTION func_test(p_class VARCHAR2)
    RETURN NUMBER IS
    V_001 NUMBER;
    V_002 NUMBER;
    V_003 NUMBER;
    .........
    BEGIN
      SELECT COUNT(*) INTO V_001 FROM 表 WHERE 条件1 AND 条件2 AND 条件3;--将 统计出的数插入到结果表的1行1列
      SELECT COUNT(*) INTO V_002 FROM 表 WHERE 条件2 AND 条件4 AND 条件5;;--将 统计出的数插入到结果表的1行1列  SELECT COUNT(*) INTO V_003 FROM 表 WHERE 条件1 AND 条件3 AND 条件6;;--将 统计出的数插入到结果表的2行1列  ......
      RETURN V_001;
      ......
    END;
      

  12.   

    "我为了这样的动态交叉报表郁闷了3天..在oracle里面没有解决..所以..在.net里面做了...其实..我的pl/sql不是很熟悉...我觉得...在数据库里面也能实现..但是..从..软件工程的角度出发..你最好不要写在数据库里面...不利于复用和移植...."
    不太同意这样的说法...你是站在前端开发者的角度来考虑..如果用数据库实现..我就不用操心你用什么开发工具了..只管提供接口就行...这才是有利于复用和移植..并且..如果是大量的数据记录进行复杂的统计..你把数据提到前面去做..效率肯定要低得多....呵呵...
      

  13.   

    用pl/sql的表类型变量不行吗?create or replace package testpkg
     is
      type typNumber is table of number(10) index by binary_integer;
      procedure testproc(p_1  ...,   p_2  ...,   p_ret out typNumber);
    end testpkg;create or replace package body testpkg
      is
      procedure testproc(p_1  ...,   p_2  ...,   p_ret out typNumber)
        is
      begin
      --将 统计出的数存入p_ret(1)变量中
      SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件1 AND 条件2 AND 条件3;  --将 统计出的数存入p_ret(2)变量中
      SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件2 AND 条件4 AND 条件5;  end testproc;end testpkg;最后返回p_ret()。
      

  14.   

    decode可以转换列与行之间的转换
      

  15.   

    SELECT 部门,
           SUM(case when 性别='男' then 1 else 0 end )  MAN,
           SUM(case when 性别='女'then 1 else 0 end )  WOMAN,
           SUM(case when case when 学历='大学' then 1 else 0 end)  DXUE,
           SUM(case when 学历='本科'  then 1 else 0 end)  BENKE
    GROUP BY 部门
    WHERE .......
      

  16.   

    象这类型二维、三维表,sql难以实现,利用discover工具简单易用,楼主可考虑此工具.
    安装工具在官方网站可以找到
      

  17.   

    回复人: KingSunSha(弱水三千) ( ) 信誉:115  2004-09-10 05:13:00  得分: 0  用pl/sql的表类型变量不行吗?create or replace package testpkg
     is
      type typNumber is table of number(10) index by binary_integer;
      procedure testproc(p_1  ...,   p_2  ...,   p_ret out typNumber);
    end testpkg;create or replace package body testpkg
      is
      procedure testproc(p_1  ...,   p_2  ...,   p_ret out typNumber)
        is
      begin
      --将 统计出的数存入p_ret(1)变量中
      SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件1 AND 条件2 AND 条件3;  --将 统计出的数存入p_ret(2)变量中
      SELECT COUNT(*) INTO p_ret(1) FROM 表 WHERE 条件2 AND 条件4 AND 条件5;  end testproc;end testpkg;最后返回p_ret()。
    我觉得就行啊 不错
      

  18.   

    TO:  glmcglmc(joe) ( ) 其实放在前面还是后面要看具体的情况..我的情况是:1.我对oracle不是很熟悉.2.我的数据量不是很大.3.如果.考虑要是移植数据库怎么办? 再说了..不是还有个东西叫做web服务吗...或是com.....要是想不考虑开发工具...也容易办....我是新到公司的...boss给的任务紧...工作量大..呵呵...先实现了再说...继续听高手发言... :)
      

  19.   

    给出我上课用的案例吧!
    不知能不能解决这个问题!见笑了!
    -----------------------------------------------行转列案例:
    1\求出所有的科目.
    2\根据所有的科目动态生成一个CREATE 语句.此CREATE 语句为建立横着
    的成绩的表命令.
    3\通过动态SQL执行生成的SQL语句
    4\求出所有的学生.
    5\求每一门学生的每一门科目,依次填入横着的成绩表
    create table score
    (
    xh varchar(4),
    subject varchar(10),
    score number(6,2) default 0
    )
     declare
       cursor kmcur is select distinct subject from score;
       cursor stucur is select distinct xh from score;
       cursor scorecur(yourxh varchar) is select score from score where xh=yourxh;
       mykm varchar(10):='';
       myxh varchar(4):='';
       createsql varchar(200):='';
       vcursor int:=0;
       myscore int:=0;
       scorelist varchar(100):='';
       insertstr varchar(200):='';
       fineinsertstr varchar(200):='';
       subjectlist varchar(100):='';
     begin
       insertstr:='insert into newscore (xh';
       createsql:='create table newscore (xh varchar(4)';
       open kmcur;
       loop
        fetch kmcur into mykm;
        exit when kmcur%notfound;
        createsql:=createsql||','||mykm||' '||'number(6,2)';
        subjectlist:=subjectlist||','||mykm;
       end loop;
       close kmcur;
        createsql:=createsql||')';
     --   dbms_output.put_line(subjectlist);
        insertstr:=insertstr||subjectlist||') values (';
     --   dbms_output.put_line(insertstr);
        vcursor:=dbms_sql.open_cursor;
        dbms_sql.parse(vcursor,createsql,dbms_sql.native);
        dbms_sql.close_cursor(vcursor);
        open stucur;
        loop
          fetch stucur into myxh;
          exit when stucur%notfound;
          fineinsertstr:=insertstr||myxh||',';
          open scorecur(myxh);
          loop
             fetch scorecur into myscore;
             exit when scorecur%notfound;
     --        dbms_output.put_line(myxh||'   '||myscore);
             scorelist:=scorelist||trim(to_char(myscore))||',';
          end loop;
          scorelist:=substr(scorelist,1,length(scorelist)-1);
          execute immediate fineinsertstr||scorelist||')';
          fineinsertstr:='';
          scorelist:='';
          close scorecur;
        end loop;
        close stucur;
     end;
     /
    望各位多多讨论!共同学习!
    good lucky!
    北大青鸟宜昌斯瑞
    真诚希望你能走入IT行业!
      

  20.   

    SELECT 部门,
           SUM(DECODE(性别,'男',1,0))  男,
           SUM(DECODE(性别,'女',1,0))  女,
           SUM(DECODE(学历,'大学',1,0))  专科,
           SUM(DECODE(学历,'本科',1,0))  本科
    GROUP BY 部门 
    WHERE 条件
      

  21.   

    up 
    up
    up 
    up 
    up 
    up
      

  22.   

    我提一下我的看法:
    可以先做一个数组,然后将条件依次录入数组(男,女,本科,大学................--根据入参依次取出),
    再根据二楼给出的格式拼sql,即可。
    当然在存储过程的开始设置入参:第一个:部门(要排序的字段),第二个性别,第三个学历...........(根据你表的字段个数)
    执行所得的sql,填入xml里面即可!!!
      

  23.   

    有点像行列转换
    能上 asktom.oralce.com 吗  能的话在上面搜搜dbms_sql 有可能对你的问题有帮助的
      

  24.   

    用分析函数 over partition 我想一定可以做到.