表内容:name    km    cj
张三    yw    81
张三    sx    82
张三    yy    83
张三    wl    84
张三    hx    85
李四    yw    71
李四    sx    72
李四    yy    73
李四    wl    74其中 km 是动态的,可能还有dl,sw......希望得到结果:
name  yw sx yy wl hx
张三  81 82 83 84 85
李四  81 82 83 84 0多谢!

解决方案 »

  1.   

    首先用動態的sql創建一個新表表結構 name  yw sx yy wl hx
    論壇裡以前有相同的提問
      

  2.   

    能否说详细点,谢谢!
    以前的那个找了很就没有找到。
    另外我的数据库是oracle 9i。
      

  3.   

    写个函数拼出一个动态SQLzhang@zhang>create or replace function f_sql return varchar2 is
      2         cursor ub is select km from zhang.test2 group by km;
      3         sql_command         varchar2(2000);
      4  begin  
      5         sql_command:='select name';
      6         for tab in ub loop
      7             sql_command:=sql_command||', max(decode(km, '''||tab.km||''', cj, 0)) '||tab.km;
      8         end loop;
      9         sql_command:=sql_command||' from zhang.test2 group by name';
     10         dbms_output.put_line(sql_command);
     11         return sql_command;
     12  end;
     13  /Function created.zhang@zhang>variable c  varchar2(2000);
    zhang@zhang>execute :c:= f_sql;
    select name, max(decode(km, 'hx', cj, 0)) hx, max(decode(km, 'sx', cj, 0)) sx, max(decode(km, 'wl', 
    'yw', cj, 0)) yw, max(decode(km, 'yy', cj, 0)) yy from zhang.test2 group by namePL/SQL procedure successfully completed.zhang@zhang>select name, max(decode(km, 'hx', cj, 0)) hx, max(decode(km, 'sx', cj, 0)) sx, 
      2  max(decode(km, 'wl','yw', cj, 0)) yw, max(decode(km, 'yy', cj, 0)) yy from zhang.test2 group by
     name;NAME                         HX         SX YW         YY
    -------------------- ---------- ---------- -- ----------
    李四                          0         72 yw         73
    张三                         85         82 yw         83
      

  4.   

    换行的时候显示有点问题
    zhang@zhang>select name, max(decode(km, 'hx', cj, 0)) hx, max(decode(km, 'sx', cj, 0)) sx, max(decod
    e(km, 'wl',cj, 0)) yw, max(decode(km, 'yy', cj, 0)) yy from zhang.test2 group by name;NAME                         HX         SX         YW         YY
    -------------------- ---------- ---------- ---------- ----------
    李四                          0         72         74         73
    张三                         85         82         84         83函数
    create or replace function f_sql return varchar2 is
           cursor ub is select km from zhang.test2 group by km;
           sql_command         varchar2(2000);
    begin  
           sql_command:='select name';
           for tab in ub loop
               sql_command:=sql_command||', max(decode(km, '''||tab.km||''', cj, 0)) '||tab.km;
           end loop;
           sql_command:=sql_command||' from zhang.test2 group by name';
           dbms_output.put_line(sql_command);
           return sql_command;
    end;
      

  5.   

    怎么能执行通过f_sql函数返回的sql_command语句。
    在pl/sql中执行;
    谢谢!
      

  6.   

    1. 在PL/SQL中定义一个变量variable   a   varchar2(2000);2. 执行函数execute :a:=f_sql;3. 把变量 A 显示出来print;
      

  7.   

    那个f_sql函数返回的值的确就是我想运行的sql语句,现在就是不知道
    怎么去运行它;多谢!
      

  8.   

    zzwind5 好:
    我是想
     <Query>
          <![CDATA[ 
      create or replace function f_sql return varchar2 is
    cursor ub is select km from test group by km;
    sql_command         varchar2(2000);
    begin  
    sql_command:='select name';
    for tab in ub loop
    sql_command:=sql_command||', max(decode(km, '''||tab.km||''', cj, 0)) '||tab.km;
    end loop;
    sql_command:=sql_command||' from test group by name';
    dbms_output.put_line(sql_command);
    return sql_command;
    end;
      
    variable a varchar2(2000);
    execute :a :=f_sql;
    print :a;
          ]]>
        </Query>但处理不成功;你说这样写可以么?谢谢!
      

  9.   

    也就是想把
    create or replace function f_sql return varchar2 is
    cursor ub is select km from test group by km;
    sql_command         varchar2(2000);
    begin  
    sql_command:='select name';
    for tab in ub loop
    sql_command:=sql_command||', max(decode(km, '''||tab.km||''', cj, 0)) '||tab.km;
    end loop;
    sql_command:=sql_command||' from test group by name';
    dbms_output.put_line(sql_command);
    return sql_command;
    end;
      
    variable a varchar2(2000);
    execute :a :=f_sql;
    print :a;当作一个sql进行处理;
    不知道行不行,谢谢了!
      

  10.   

    你把那个 SQL 复制一下再贴出来执行不就行了
    或者建立一个表保存 SQL语句的结果数据 把程序该一下create or replace function f_sql return varchar2 is
    cursor ub is select km from test group by km;
    sql_command varchar2(2000);
    begin
    execute immediate 'drop table test_2';
    sql_command:='select name';
    for tab in ub loop
    sql_command:=sql_command||', max(decode(km, '''||tab.km||''', cj, 0)) '||tab.km;
    end loop;
    sql_command:=sql_command||' from test group by name';
    dbms_output.put_line(sql_command);
    execute immediate'create table test_2 as '||sql_command;
    return sql_command;
    end;函数执行完后
    select * from test_2