如下图所示:
          年份 总人数 英国 德国 荷兰 丹麦 美国 意大利
          2009 1111   99    88   00   77   88  22
          2010 8888   11    99   00   88   33  11
          2011 8877   000   88   77   67   89  00我想把上图转换为下图的样子:
         
         年份   2009   2010   2011
        总人数  1111   8888   8877
         英国    99     11     000
         德国    88     99     88
         荷兰    00     00     77 
         丹麦    77     88     67
         美国    88     33     89
         意大利  22     11     00
但是不知道该怎么写语句,求解!谢谢您!

解决方案 »

  1.   

      奇怪的事以前问的Oracle的问题在这儿会很快就有人给出解决的办法的,但是这一次在CSDN上发帖已经70分钟了,但是一直没有前辈回答我的可能在前辈们看来很幼稚而无知的问题,我其实真的不知道是我的问题太简单了,而没有人愿意回答呢,还是这个问题真的有点棘手啊!
        前辈们,请你们浮出水面吧!像我一样的这些刚刚开始学这些知识的小辈真的需要你们的扶持与帮助,我们需要你们!如果没有你们的帮助我们会成长的很慢很辛苦的!
      

  2.   

    最好用编程软件去实现,纯粹用oracle也可以但是很麻烦。把数据放到矩阵中,然后用循环插入语句插入数据。
      

  3.   


    嘿嘿,我都没有注意这个问题哦!因为我都是周一至周五在学校上课,周末才学Oracle的!
      

  4.   


    这个 应该是动态的行列互转  貌似难度不小哇 原本想着 查询表中所有字段 为行头  来左联这表 配合decode和每个行头来查询 貌似行不通...不知道用存储可以完成不.create table t1 (y number(4),c1 number(10),c2 number(10),c3 number(10),c4 number(10),c5 number(10),c6 number(10),c7 number(10));
    insert into t1 values (2009,1111,99,88,00,77,88,22);
    insert into t1 values (2010,8888,11,99,00,88,33,11);
    insert into t1 values (2011,7766,00,88,77,67,89,00);
    commit;
      

  5.   


    还是您们厉害的,我要学的东西还是太多了,我现在只学到简单的SQL语句,上面的我还在看不懂得,呵呵...
      

  6.   

    年份 总人数 英国 德国 荷兰 丹麦 美国 意大利  你这个是表头?1.把列转成 行 来显示 (行数固定)
    2.年份 用行转列 (每增加一年 增加一行)ps:csdn贴图 很坑... ,到个人 中心 ->  我的 博客 ->写 新文章 -> 里面的编辑器 可以上传图片,然后 你在相册里面可以看到 图片了,把链接 复制过来就可以了。
      

  7.   


       进入csdn空间  截图后 上传到csdn的空间  右键图片 查看图片网址  复制  然后在这里点击图片按钮 粘贴地址 确定就可以了
      

  8.   

    http://topic.csdn.net/u/20120504/14/b339a136-a576-4ee1-9ef4-ea2b4633fde6.html#top
      

  9.   

    可以看下这个
    create table t1 (y number(4),c1 number(10),c2 number(10),c3 number(10),c4 number(10),c5 number(10),c6 number(10),c7 number(10));
    insert into t1 values (2009,1111,99,88,00,77,88,22);
    insert into t1 values (2010,8888,11,99,00,88,33,11);
    insert into t1 values (2011,7766,00,88,77,67,89,00);
    commit;
    SELECT column_name,
      SUM(y2009) y2009,
      SUM(y2010) y2010,
      SUM(2011) y2011
    FROM
      (SELECT column_name,
        DECODE(y, 2009, DECODE(column_id, 2, t, 3, c1, 4, c2, 5,c3,6,c4,7,c5,8,c6),0) y2009,
        DECODE(y, 2010, DECODE(column_id, 2, t, 3, c1, 4, c2, 5,c3,6,c4,7,c5,8,c6),0) y2010,
        DECODE(y, 2011, DECODE(column_id, 2, t, 3, c1, 4, c2, 5,c3,6,c4,7,c5,8,c6),0) y2011
      FROM user_tab_columns,
        t1
      WHERE table_name = 'T1'
      AND column_id    > 1
      )
    GROUP BY column_name
    ORDER BY column_name;--生成SQL语句
    DECLARE
      v_sum VARCHAR2(200) := 'SELECT column_name';
      v_col VARCHAR2(2000);
      v_tmp VARCHAR2(200);
      v_sql VARCHAR2(4000);
    BEGIN
      FOR rc IN(SELECT DISTINCT y FROM t1)
      LOOP
        v_sum   := v_sum || ', SUM(y' || rc.y || ') y' || rc.y;
        v_col   := v_col || ', DECODE(y, ' || rc.y || ', DECODE(column_id ';
        FOR col IN(SELECT column_name,column_id FROM user_tab_columns
          WHERE column_id > 1 AND table_name  = 'T1')
        LOOP
          v_tmp := v_tmp || ',' || col.column_id || ',' || col.column_name;
        END LOOP;
        v_col := v_col || v_tmp || '), 0)' || ' y' || rc.y;
        v_tmp := NULL;
      END LOOP;
      v_sql := v_sum || ' FROM (SELECT column_name ' || v_col
            || ' FROM user_tab_columns, t1 WHERE column_id > 1 ' 
            || 'and table_name = ''T1'') GROUP BY column_name ORDER BY column_name';
      dbms_output.put_line(v_sql);
    END;
      

  10.   


    --如果数据量太大的话这个代码量会很大,但是一时想不出其他的办法,因为你的列名要做为行的内容,只有硬编码。--
    WITH t1 AS (
    SELECT 2009 YEAR,1111 TOTAL_PEO,99 US,88 GER,0 NL,77 DEN FROM DUAL
    UNION ALL
    SELECT 2010, 8888, 11 ,99, 0, 88 FROM DUAL
    UNION ALL
    SELECT 2011, 8877, 0, 88, 77, 67 FROM DUAL
    )
    SELECT 'YEAR' C_NUM_Y, 2009 C_NUM_Y_09,2010 C_NUM_Y_10,2011 C_NUM_Y_11 FROM dual
    UNION ALL
    SELECT 'TOTAL_PEO',MAX(DECODE(t1.YEAR,2009,t1.TOTAL_PEO)),MAX(DECODE(t1.YEAR,2010,t1.TOTAL_PEO)),MAX(DECODE(t1.YEAR,2011,t1.TOTAL_PEO)) FROM t1
    UNION ALL 
    SELECT 'US',MAX(DECODE(t1.YEAR,2009,t1.US)),MAX(DECODE(t1.YEAR,2010,t1.US)),MAX(DECODE(t1.YEAR,2011,t1.US)) FROM t1
    UNION ALL 
    SELECT 'GER',MAX(DECODE(t1.YEAR,2009,t1.GER)),MAX(DECODE(t1.YEAR,2010,t1.GER)),MAX(DECODE(t1.YEAR,2011,t1.GER)) FROM t1
    UNION ALL 
    SELECT 'NL',MAX(DECODE(t1.YEAR,2009,t1.NL)),MAX(DECODE(t1.YEAR,2010,t1.NL)),MAX(DECODE(t1.YEAR,2011,t1.NL)) FROM t1
    UNION ALL 
    SELECT 'DEN',MAX(DECODE(t1.YEAR,2009,t1.DEN)),MAX(DECODE(t1.YEAR,2010,t1.DEN)),MAX(DECODE(t1.YEAR,2011,t1.DEN)) FROM t1