表结构:
人员编码 月份 工时 天数
  001     1    12   5
  001     2    20   6
  001     3    18   8
  002     1    12   5
  002     2    15   6
  002     3    18   7如何通过sql语句查询出如下显示结果
人员编码  内容    1月   2月  3月 ......12月
  001     工时    12   20   18
  001     天数    5    6    8
  002     工时    12   15   18
  002     天数    5    6    7希望高手帮帮忙,万分感谢

解决方案 »

  1.   

    select * 
    from (select 人员编码,sum(decode(月份,1,工时,0) 1月,
    sum(decode(月份,2,工时,0) 2月,
    sum(decode(月份,3,工时,0) 3月,
    sum(decode(月份,4,工时,0) 4月,
    sum(decode(月份,5,工时,0) 5月,
    sum(decode(月份,6,工时,0) 6月,
    sum(decode(月份,7,工时,0) 7月,
    sum(decode(月份,8,工时,0) 8月,
    sum(decode(月份,9,工时,0) 9月,
    sum(decode(月份,10,工时,0) 10月,
    sum(decode(月份,11,工时,0) 11月,
    sum(decode(月份,12,工时,0) 12月
    from table
    group by 人员编码
    union all
    select 人员编码,sum(decode(月份,1,天数,0) 1月,
    sum(decode(月份,2,天数,0) 2月,
    sum(decode(月份,3,天数,0) 3月,
    sum(decode(月份,4,天数,0) 4月,
    sum(decode(月份,5,天数,0) 5月,
    sum(decode(月份,6,天数,0) 6月,
    sum(decode(月份,7,天数,0) 7月,
    sum(decode(月份,8,天数,0) 8月,
    sum(decode(月份,9,天数,0) 9月,
    sum(decode(月份,10,天数,0) 10月,
    sum(decode(月份,11,天数,0) 11月,
    sum(decode(月份,12,天数,0) 12月
    from table
    group by 人员编码)
    order by 人员编码;
      

  2.   

    select * 
    from (select 人员编码,'工时' 内容,sum(decode(月份,1,工时,0) 1月,
    sum(decode(月份,2,工时,0) 2月,
    sum(decode(月份,3,工时,0) 3月,
    sum(decode(月份,4,工时,0) 4月,
    sum(decode(月份,5,工时,0) 5月,
    sum(decode(月份,6,工时,0) 6月,
    sum(decode(月份,7,工时,0) 7月,
    sum(decode(月份,8,工时,0) 8月,
    sum(decode(月份,9,工时,0) 9月,
    sum(decode(月份,10,工时,0) 10月,
    sum(decode(月份,11,工时,0) 11月,
    sum(decode(月份,12,工时,0) 12月
    from table
    group by 人员编码,'工时'
    union all
    select 人员编码,'天数',sum(decode(月份,1,天数,0) 1月,
    sum(decode(月份,2,天数,0) 2月,
    sum(decode(月份,3,天数,0) 3月,
    sum(decode(月份,4,天数,0) 4月,
    sum(decode(月份,5,天数,0) 5月,
    sum(decode(月份,6,天数,0) 6月,
    sum(decode(月份,7,天数,0) 7月,
    sum(decode(月份,8,天数,0) 8月,
    sum(decode(月份,9,天数,0) 9月,
    sum(decode(月份,10,天数,0) 10月,
    sum(decode(月份,11,天数,0) 11月,
    sum(decode(月份,12,天数,0) 12月
    from table
    group by 人员编码,'天数')
    order by 人员编码,内容;
      

  3.   

    这样写,我知道,可不可以不使用union,因为数据量比较大,而且“内容”也很多,不止工时和天数两项,有12项,这样写我试过,,效率很低,查询速度太慢,客户忍受不了
      

  4.   

    改用存储过程用动态sql的话倒是可以简化代码,不过效率应该不会提高。
    目前我只想到这个了,等等看其他人是否有别的方法实现
      

  5.   

    小弟刚学oracle一周,下边这个可能有点繁琐,有哪位老大能帮忙简化点不select 人员编码,内容,sum("1月") as "1月"
    ,sum("2月") as "2月"
    ,sum("3月") as "3月" from 
    (select a.人员编码,a.内容,case when 月份='1' then 值 end as "1月",
    case when 月份='2' then 值 end as "2月",
    case when 月份='3' then 值 end as "3月" from 
    (select 人员编码,月份,'工时' as 内容,工时 as 值 from test.tmp
    union
    select 人员编码,月份,'天数' as 内容 ,天数 as 值 from test.tmp) a) b group by 人员编码,内容
      

  6.   

    select 人员编码,
    decode(rn,1,'工时',2,'天数')内容
    sum(decode(月份,1,decode(rn,1,工时,2天数),0) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2天数),0) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2天数),0) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2天数),0) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2天数),0) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2天数),0) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2天数),0) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2天数),0) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2天数),0) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2天数),0) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2天数),0) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2天数),0) 12月
    from mytab as a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;
      

  7.   

    CREATE OR REPLACE TYPE TYPE_TEST_1 AS OBJECT
    (
      COL_NAME  VARCHAR2(20),
      COL_VALUE NUMBER(4)
    )

    CREATE OR REPLACE TYPE TYPE_TEST_1_VARR AS VARRAY(19) OF TYPE_TEST_1; SELECT * FROM TEST_1 FOR UPDATE;SELECT T.NO, 
           A.COL_NAME, 
           SUM(DECODE(T.MONTH_ID, 1, A.COL_VALUE)) "1月",
           SUM(DECODE(T.MONTH_ID, 2, A.COL_VALUE)) "2月",
           SUM(DECODE(T.MONTH_ID, 3, A.COL_VALUE)) "3月"
    FROM TEST_1 T, 
      TABLE(TYPE_TEST_1_VARR(TYPE_TEST_1('工号', T.GS), 
                                TYPE_TEST_1('天数', T.GS))) A
      GROUP BY T.NO, A.COL_NAME
    先定义一个对象,用来存放表中的列名和值,再定义一个数据类型为该对象。
    数组赋值用:
    TABLE(TYPE_TEST_1_VARR(TYPE_TEST_1('工号', T.GS), 
                                TYPE_TEST_1('天数', T.GS),.....))--有多少列定义多少值
    名称为值对应的列名称,值为T表的对应值然后再转日期为横表
      

  8.   

    如果是11g的话,可以使用新增的行列转换函数
    CREATE TABLE TEST 
    (
     P_CODE VARCHAR2(4),
     MONTH INT,
     HOUR INT,
     DAYS INT  

      INSERT INTO TEST VALUES('001',    1 ,    12,  5);
      INSERT INTO TEST VALUES('001',    2 ,    20,  6);
      INSERT INTO TEST VALUES('001',    3 ,    18,  8);
      INSERT INTO TEST VALUES('001',    4 ,    12,  5);
      INSERT INTO TEST VALUES('001',    5 ,    15,  6);
      INSERT INTO TEST VALUES('001',    6 ,    18,  7);
      INSERT INTO TEST VALUES('001',    7 ,    12,  5);
      INSERT INTO TEST VALUES('001',    8 ,    20,  6);
      INSERT INTO TEST VALUES('001',    9 ,    18,  8);
      INSERT INTO TEST VALUES('001',    10,    12,  5);
      INSERT INTO TEST VALUES('001',    11,    15,  6);
      INSERT INTO TEST VALUES('001',    12,    18,  7);
      INSERT INTO TEST VALUES('002',    1 ,    12,  5);
      INSERT INTO TEST VALUES('002',    2 ,    20,  6);
      INSERT INTO TEST VALUES('002',    3 ,    18,  8);
      INSERT INTO TEST VALUES('002',    4 ,    12,  5);
      INSERT INTO TEST VALUES('002',    5 ,    15,  6);
      INSERT INTO TEST VALUES('002',    6 ,    18,  7);
      INSERT INTO TEST VALUES('002',    7 ,    12,  5);
      INSERT INTO TEST VALUES('002',    8 ,    20,  6);
      INSERT INTO TEST VALUES('002',    9 ,    18,  8);
      INSERT INTO TEST VALUES('002',    10,    12,  5);
      INSERT INTO TEST VALUES('002',    11,    15,  6);
      INSERT INTO TEST VALUES('002',    12,    18,  7);

    COMMIT;
    SELECT *
      FROM (SELECT P_CODE,
                   MONTH,
                   HOUR,
                   '工时' AS TYPE
              FROM TEST) ---
           PIVOT(MAX(HOUR) FOR MONTH IN (1 AS JAN, 2 AS FEB, 3 AS MAR, 4 AS APR, 5 AS MAY, 6 AS JUN, 7 AS JUL, 8 AS AUG, 9 AS SEP, 10 AS OCT, 11 AS NOV, 12 AS DEC))
    UNION
    SELECT *
      FROM (SELECT P_CODE,
                   MONTH,
                   DAYS,
                   '天数'
              FROM TEST) ---
           PIVOT(MAX(DAYS) FOR MONTH IN (1 AS JAN, 2 AS FEB, 3 AS MAR, 4 AS APR, 5 AS MAY, 6 AS JUN, 7 AS JUL, 8 AS AUG, 9 AS SEP, 10 AS OCT, 11 AS NOV, 12 AS DEC))
      

  9.   

    结果:
    P_CODE TYPE JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
    001 工时 12 20 18 12 15 18 12 20 18 12 15 18
    001 天数 5 6 8 5 6 7 5 6 8 5 6 7
    002 工时 12 20 18 12 15 18 12 20 18 12 15 18
    002 天数 5 6 8 5 6 7 5 6 8 5 6 7
      

  10.   

    sum(decode(月份,1,decode(rn,1,工时,2天数),0) 1月,
    是这行提示缺少右括号
      

  11.   

    确实是少括号了,呵呵
    select 人员编码,
    decode(rn,1,'工时',2,'天数')内容
    sum(decode(月份,1,decode(rn,1,工时,2天数),0)) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2天数),0)) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2天数),0)) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2天数),0)) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2天数),0)) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2天数),0)) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2天数),0)) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2天数),0)) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2天数),0)) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2天数),0)) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2天数),0)) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2天数),0)) 12月
    from mytab as a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;
      

  12.   

    又是行列转换的问题,在Oracle里用decode函数啊,像上面即为大侠写的那样。
      

  13.   

    select 人员编码,
    decode(rn,1,'工时',2,'天数') 内容
    sum(decode(月份,1,decode(rn,1,工时,2天数),0)) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2天数),0)) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2天数),0)) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2天数),0)) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2天数),0)) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2天数),0)) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2天数),0)) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2天数),0)) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2天数),0)) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2天数),0)) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2天数),0)) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2天数),0)) 12月
    from mytab a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;
      

  14.   

    select 人员编码,
    decode(rn,1,'工时',2,'天数') 内容,
    sum(decode(月份,1,decode(rn,1,工时,2天数),0)) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2天数),0)) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2天数),0)) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2天数),0)) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2天数),0)) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2天数),0)) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2天数),0)) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2天数),0)) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2天数),0)) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2天数),0)) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2天数),0)) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2天数),0)) 12月
    from mytab a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;是这样的吧,你们能的能运行过去?
      

  15.   

    select 人员编码,
    decode(rn,1,'工时',2,'天数') 内容,
    sum(decode(月份,1,decode(rn,1,工时,2,天数),0)) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2,天数),0)) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2,天数),0)) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2,天数),0)) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2,天数),0)) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2,天数),0)) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2,天数),0)) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2,天数),0)) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2,天数),0)) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2,天数),0)) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2,天数),0)) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2,天数),0)) 12月
    from mytab a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;
      

  16.   

    decode(rn,1,'工时',2,'天数')内容
    这行后面的括号是全角的,改成半角的
      

  17.   

    select 人员编码,
    decode(rn,1,'工时',2,'天数')内容
    sum(decode(月份,1,decode(rn,1,工时,2天数),0) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2天数),0) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2天数),0) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2天数),0) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2天数),0) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2天数),0) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2天数),0) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2天数),0) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2天数),0) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2天数),0) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2天数),0) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2天数),0) 12月
    from mytab as a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;
      

  18.   

    select 人员编码,
    decode(rn,1,'工时',2,'天数') 内容
    sum(decode(月份,1,decode(rn,1,工时,2天数),0) 1月,
    sum(decode(月份,2,decode(rn,1,工时,2天数),0) 2月,
    sum(decode(月份,3,decode(rn,1,工时,2天数),0) 3月,
    sum(decode(月份,4,decode(rn,1,工时,2天数),0) 4月,
    sum(decode(月份,5,decode(rn,1,工时,2天数),0) 5月,
    sum(decode(月份,6,decode(rn,1,工时,2天数),0) 6月,
    sum(decode(月份,7,decode(rn,1,工时,2天数),0) 7月,
    sum(decode(月份,8,decode(rn,1,工时,2天数),0) 8月,
    sum(decode(月份,9,decode(rn,1,工时,2天数),0) 9月,
    sum(decode(月份,10,decode(rn,1,工时,2天数),0) 10月,
    sum(decode(月份,11,decode(rn,1,工时,2天数),0) 11月,
    sum(decode(月份,12,decode(rn,1,工时,2天数),0) 12月
    from mytab as a,(select rownum as rn from dual connect by rownum<=2) b
    group by 人员编码,rn
    order by 人员编码,rn;
      

  19.   

    还有个问题
    select rownum as rn from dual connect by rownum<=2
    此处的rownum为何只能<=2,当把rownum设为<=3的时候就提示“用户数据中的connect by 循环”
    请问如何解决
      

  20.   

    就单独执行
    select rownum as rn from dual connect by rownum <=3这句就报错“用户数据中的connect by 循环”
    只要大于2就报
      

  21.   

    没问题啊SQL> select rownum as rn from dual connect by rownum <=3;       RN
    ---------
            1
            2
            3
      

  22.   

    果然是,oracle 8i就不行
    oracle 9i就没问题
      

  23.   

    有这个可能,我这环境是oracle10
    可以确定这种语法在oracle7中是不能执行的
      

  24.   

    select * 
    from (select 人员编码,sum(decode(月份,1,工时,0) 1月,
    sum(decode(月份,2,工时,0) 2月,
    sum(decode(月份,3,工时,0) 3月,
    sum(decode(月份,4,工时,0) 4月,
    sum(decode(月份,5,工时,0) 5月,
    sum(decode(月份,6,工时,0) 6月,
    sum(decode(月份,7,工时,0) 7月,
    sum(decode(月份,8,工时,0) 8月,
    sum(decode(月份,9,工时,0) 9月,
    sum(decode(月份,10,工时,0) 10月,
    sum(decode(月份,11,工时,0) 11月,
    sum(decode(月份,12,工时,0) 12月
    from table
    group by 人员编码
    union all
    select 人员编码,sum(decode(月份,1,天数,0) 1月,
    sum(decode(月份,2,天数,0) 2月,
    sum(decode(月份,3,天数,0) 3月,
    sum(decode(月份,4,天数,0) 4月,
    sum(decode(月份,5,天数,0) 5月,
    sum(decode(月份,6,天数,0) 6月,
    sum(decode(月份,7,天数,0) 7月,
    sum(decode(月份,8,天数,0) 8月,
    sum(decode(月份,9,天数,0) 9月,
    sum(decode(月份,10,天数,0) 10月,
    sum(decode(月份,11,天数,0) 11月,
    sum(decode(月份,12,天数,0) 12月
    from table
    group by 人员编码)
    order by 人员编码;