表结构:
union   sex
004 2
002 2
002 2
003 1
002 1现在我想显示这样的结果
         1           2
002      1           2
003      1           0
004      0           1
也就是说按union sex两个字段count人数,得到二维表

解决方案 »

  1.   

    select count(decode(sex,1,1))"1",
      count(decode(sex,2,1))"2"
    from tab1
    group by union
      

  2.   

    如何实现行列转换  
      [A]1、固定列数的行列转换  
      如  
      student   subject   grade  
      ---------------------------  
      student1   语文   80  
      student1   数学   70  
      student1   英语   60  
      student2   语文   90  
      student2   数学   80  
      student2   英语   100  
      ……  
      转换为    
      语文   数学   英语  
      student1   80   70   60  
      student2   90   80   100  
      ……  
      语句如下:  
      select   student,sum(decode(subject,'语文',   grade,null))   "语文",  
      sum(decode(subject,'数学',   grade,null))   "数学",  
      sum(decode(subject,'英语',   grade,null))   "英语"  
      from   table  
      group   by   student  
       
      2、不定列行列转换  
      如  
      c1   c2  
      --------------  
      1   我  
      1   是  
      1   谁  
      2   知  
      2   道  
      3   不  
      ……  
      转换为  
      1   我是谁  
      2   知道  
      3   不  
      这一类型的转换必须借助于PL/SQL来完成,这里给一个例子  
      CREATE   OR   REPLACE   FUNCTION   get_c2(tmp_c1   NUMBER)    
      RETURN   VARCHAR2    
      IS    
      Col_c2   VARCHAR2(4000);    
      BEGIN  
      FOR   cur   IN   (SELECT   c2   FROM   t   WHERE   c1=tmp_c1)   LOOP    
      Col_c2   :=   Col_c2||cur.c2;    
      END   LOOP;    
      Col_c2   :=   rtrim(Col_c2,1);  
      RETURN   Col_c2;    
      END;  
      /  
      SQL>   select   distinct   c1   ,get_c2(c1)   cc2   from   table;即可
      

  3.   

    select id,sum(decode(sex,"1",1,0)) "1",sum(decode(sex,"2",1,0)) "2" from table_name group by id;
      

  4.   

    二楼的能不能动态一点呀,如果我sex 的标识为3 或5呢?
      

  5.   

    若字段数不确定,需要通过存储过程来拼
    --创建过程
    create or replace procedure proc
    as
    sqlstr varchar2(2000):='create or replace view v_tmp as select "UNION"';
    begin
      for cur1 in (select distinct sex from tab1)
      loop
        sqlstr:=sqlstr||'
      ,count(decode(sex,'||cur1.sex||',1))"'||cur1.sex||'"';
      end loop;
      sqlstr:=sqlstr||' from tab1 group by "UNION"';
      execute immediate sqlstr;
    end;
    --调用
    begin
    proc;
    end;
    --查看结果
    select * from v_tmp
      

  6.   


    这个procedure没有out参数,怎么接受结果集呀。 是不是要加个结果集的out 参数呀。
      

  7.   

    ..不是,我觉得结果集处理很麻烦
    直接在过程里建视图,然后查询视图会更方便
    这个过程产生的视图固定为v_tmp
    运行完过程后查询v_tmp视图即可
      

  8.   

    WITH A AS
     (SELECT '004' 部门, '2' 性别
        FROM DUAL
      UNION ALL
      SELECT '002' 部门, '2' 性别
        FROM DUAL
      UNION ALL
      SELECT '002' 部门, '2' 性别
        FROM DUAL
      UNION ALL
      SELECT '003' 部门, '1' 性别
        FROM DUAL
      UNION ALL
      SELECT '002' 部门, '1' 性别 FROM DUAL)
    SELECT 部门, COUNT(DECODE(性别, '1',1)), COUNT(DECODE(性别, '2', 1)) FROM A
    GROUP BY 部门 ORDER BY 部门;