现有表结构如下
  hh    dbbm
  123    01Q1
  45     01A1
  45     01C1
  908    01Q1
  676    01A1
  676    01C1
在查询后要得到这样的结果
  hh     dbbm1     dbbm2
  123    01Q1           
  45     01A1      01C1
  908    01Q1          
  676    01A1      01C1
问题比较急,请知道的兄台不吝赐教

解决方案 »

  1.   

    zt  马可整理
    http://community.csdn.net/Expert/topic/3222/3222974.xml?temp=.5841181col1      col2
    -----------------
    0001      Tom
    0001      Jack
    0001      Mike
    0002      Kate
    0002      Rose
    0002      Fene如何用一条SQL语句得到如下结果:
    col1     col2
    -----------------
    0001     Tom,Jack,Mike
    0002     Kate,Rose,Fene创建自定义函数:
    create  or  replace  function  f_ename(jobno  in  varchar2)  
    return  varchar2  is  
       
    str_return  varchar2(200);  
    cursor  c_ename(v_jobno  varchar2)  is  select  ename  from  emp  where  job=v_jobno;  
    begin  
    for  str_temp  in  c_ename(jobno)  loop  
    str_return:=str_return||str_temp.ename;  
    end  loop;  
    return  str_return;  
    end;  
    /  调用:
    select job,f_ename(job) from (select distinct job from emp);  oracle 如何做行列动态的交叉表 
    http://community.csdn.net/Expert/topic/3093/3093861.xml?temp=.5882379
    /*
    Create table test (name varchar2(10),km varchar2(10),cj number)
    go
    insert into test values('张三','语文',80);
    insert into test values('张三','数学',86);
    insert into test values('张三','英语',75);
    insert into test values('李四','语文',78);
    insert into test values('李四','数学',85);
    insert into test values('李四','英语',78);
    select * from test;select name,
     sum(decode(km,'语文',cj,0)) as 语文,
     sum(decode(km,'数学',cj,0)) as 数学, 
     sum(decode(km,'英语',cj,0)) as 英语
    from test
    group by name;
    */CREATE OR REPLACE PACKAGE Pack_Test
    AS
    TYPE QUERY_CURSOR IS REF CURSOR;
    PROCEDURE My_cur_out(
    result out QUERY_CURSOR);
    END Pack_Test;
    CREATE OR REPLACE PACKAGE BODY Pack_Test
    AS
    PROCEDURE My_cur_out(
    result out QUERY_CURSOR
    )
        AS
            BEGIN
            
    DECLARE 
       v_result varchar2(4000);
       v_table varchar2(255):='TEST';--表名
       v_col1 varchar2(255):='NAME'; --表的第一个列
       v_col2 varchar2(255):='KM';   --表的第二个列
       v_col3 varchar2(255):='CJ';   --表的第三个列
       v_value varchar2(255);
       v_file utl_file.file_type;
       TYPE cur_type IS REF CURSOR;
       cur_row   cur_type;
    BEGIN
      v_result := 'SELECT '||v_col1;
      OPEN cur_row FOR 'SELECT DISTINCT '||v_col2||' FROM '||v_table;
      LOOP
        FETCH cur_row INTO v_value;
        EXIT WHEN cur_row%NOTFOUND;  
        v_result := v_result||',sum(decode('||v_col2||','''||v_value||''','||v_col3||','''')) as '||v_value;   
      END LOOP;
      CLOSE cur_row;
      v_result := v_result||' from '||v_table||' group by '||v_col1;
      
      OPEN result FOR v_result;
    END;
              
     
            END;
    END Pack_Test;
      

  2.   

    谢谢icedut(冰) 兄,但我不是这个意思,
    答案跟你说的第一个例子有点相似,但是不是在一列显示,而是要分2列分别显示01A1,01C1
    ,如果是01Q1的话第二列就显示为空
      

  3.   

    CREATE TABLE ll_TEST1 (NAME VARCHAR2(10),km VARCHAR2(10),cj NUMBER)
    GO
    INSERT INTO ll_TEST1 VALUES('张三','语文',80);
    INSERT INTO ll_TEST1 VALUES('张三','数学',86);
    INSERT INTO ll_TEST1 VALUES('张三','英语',75);
    INSERT INTO ll_TEST1 VALUES('李四','语文',78);
    INSERT INTO ll_TEST1 VALUES('李四','数学',85);
    INSERT INTO ll_TEST1 VALUES('李四','英语',78);
    SELECT * FROM ll_TEST1;SELECT NAME,
     SUM(DECODE(km,'语文',cj,0)) AS 语文,
     SUM(DECODE(km,'数学',cj,0)) AS 数学, 
     SUM(DECODE(km,'英语',cj,0)) AS 英语,
     SUM(DECODE(km,'英语1',cj,NULL)) AS 英语1
    FROM ll_TEST1
    GROUP BY NAME;--改改不就是你要的结果么
    如果列是动态的
    你参考一下那个包
      

  4.   

    45     01A1
      45     01C1
    如果45 有01Q1 怎么办啊
      

  5.   

    select  hh, min(dbbm) dbbm1 ,nullif(max(dbbm),min(dbbm)) dbbm2
    from t
    group by hh
      

  6.   

    yaozw_mountain(山林)
    问题已经解决,十分感谢,20分送上
      

  7.   

    同时也谢谢icedut(冰) 朋友的帮助