郑重声明:以下sql语句均运行于 Oracle10g  大家一定要留意是oracle10g运行环境哦!原表信息如下create table TEST
(
  ITEMNAME  VARCHAR2(20),
  ITEMVALUE VARCHAR2(20),
  ID        NUMBER,
  LINE      NUMBER
)insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('身高', '160cm', 1, 1, 'AAAM0uAAEAAAAFGAAA');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('姓名', '飞扬的学', 2, 1, 'AAAM0uAAEAAAAFGAAB');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('身高', '180cm', 3, 2, 'AAAM0uAAEAAAAFGAAC');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('姓名', '镜中的我', 4, 2, 'AAAM0uAAEAAAAFGAAD');insert into test (ITEMNAME, ITEMVALUE, ID, LINE, ROWID)
values ('视力', '2.0的', 5, 2, 'AAAM0uAAEAAAAFGAAE');我写的查询语句如下select  
line line,
max(case itemname when '身高' then itemvalue else null end) 身高,
max(case itemname when '姓名' then itemvalue else null end) 姓名,
max(case itemname when '视力' then itemvalue else null end) 视力
from test 
group by line;
这是原表的数据"ITEMNAME" "ITEMVALUE" "ID" "LINE"
"身高" "160cm" 1 1
"姓名" "张三" 2 1
"身高" "180cm" 3 2
"姓名" "宝林" 4 2
"视力" "2.0的" 5 2这是查询结果"LINE" "身高" "姓名" "视力"
1 "160cm" "张三" ""
2 "180cm" "宝林" "2.0的"大家注意!
核心问题:
我写的sql语句,查询的结果是固定列的 只有(身高,姓名,视力) 三列
问题是原表中 ITEMNAME列的值 不只是 (身高,姓名,视力) 三个值请各位高手 献出良策,感激不尽!
 

解决方案 »

  1.   

    --项数不固定,单个SQL无法完成,使用存储过程动态拼接
    CREATE OR REPLACE PROCEDURE row2col(o OUT SYS_REFCURSOR) IS
      sqlstr VARCHAR2(4000) := '';
    BEGIN
      FOR cc IN (SELECT distinct itemname FROM test) LOOP
        sqlstr := sqlstr || 'sum(decode(itemname,''' || cc.itemname ||''',itemvalue)) as "' 
                         || cc.itemname || '",';
      END LOOP;
      sqlstr := 'select line,' || rtrim(sqlstr,',') || ' from test group by line';
      OPEN o FOR sqlstr;
    END row2col;
      

  2.   

    参考:http://topic.csdn.net/u/20091018/15/7c6729b6-79d1-492e-862d-af9c4921f172.html?91738表结构: 
    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人数,得到二维表
    --创建过程
    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
      

  3.   

    #2楼  回答的很有道理 
    decode 我理解不深,能具体说一下他的功能,或者提供有效的资料
    还有 有没有简化的方法
    SqlServer  有PIVOT 和 UNPIVOT 
    不知道 oracle 有没有类似功能的关键字