解决方案 »

  1.   

    Quote: 引用 楼主 sourcecode1 的回复:

    Quote:
    11G:
    with t1 as
     (select 1 dept_id, 'dept 1' dept_nm from dual),
    t2 as
     (select 1 emp_id, 'n1' emp_nm, 'M' sex, 1 dept_id
        from dual
      union all
      select 2 emp_id, 'n2' emp_nm, 'F' sex, 1 dept_id
        from dual
      union all
      select 3 emp_id, 'n3' emp_nm, 'M' sex, 1 dept_id
        from dual
      union all
      select 4 emp_id, 'n4' emp_nm, 'F' sex, 1 dept_id
        from dual)
    select *
      from (SELECT t1.dept_nm, emp_id, sex
              FROM T1, T2
             WHERE T1.DEPT_ID = T2.DEPT_ID) pivot(max(sex) for(emp_id) in(1 n1,
                                                                          2 n2,
                                                                          3 n3,
                                                                          4 n4));
      

  2.   

    11g用pivot
    之前的版本可以用max(decode)
    由于你的列数不固定,只能采用动态语句的方式
    先根据语法构建sql语句,然后利用拼接的结果去执行查询
      

  3.   

    问下你业务的逻辑问题
    如果存在重名的职工你准备如何处理,oracle肯定是不允许查询的两列列名相同的
      

  4.   

    select *
      from (SELECT T1.部门名称, T2.员工名, T2.性别
              FROM 部门表 T1, 员工表  T2
             WHERE T1.部门ID = T2.部门ID
              order by T2.员工Id) pivot(max(性别) for(员工名) in(any));
    --注:ANY 仅在XML 中可以使用
    Oracle 11g 行列互换 pivot 和 unpivot 说明
      

  5.   

    有个要求就只能是用sql来输出结果,  员工数是不定的,所以列也是不固定的。
    而ANY 是在XML中使用的,想过In里面用子查询好像是不可以的。
      

  6.   

    自己解决了,使用存储过程动态拼接sql