2

この質問の言い回しはわかりませんが、PL/SQLで行の値を列に変換しようとしています。私は初心者ではありませんが、これを行う方法がわかりません。次のテーブルデータがあります。

名前の責任


Joe Sales
Steve Sales
Paul Exec
Pete Manager
John Exec
Roger Sec
Scott Exec

次のようにデータを返し表示するクエリを作成する必要があります。

セールスマネージャーエグゼクティブセクション


ジョーピートジョンロジャー
スティーブヌルスコットヌル
ヌルヌルポールヌル

私が直面している問題は、行データがとにかく互いに関連していないことです。これもできますか?

私は誰もがこれに関して提供できるどんな助けにも感謝します。ありがとう。

4

1 に答える 1

0

まず第一に、今後データベースのバージョンを教えていただけると助かります。たとえば、Oracle 11g を使用している場合、それが希望どおりでなくても、PIVOTで同様のことができます。

with pivot_data as (select rownum as no,emp_name,job_name from (
select 'Joe' as emp_name,'Sales' as job_name from dual union all
select 'Steve','Sales'    from dual union all
select 'Paul','Exec'     from dual union all
select 'Pete','Manager'  from dual union all
select 'John','Exec'     from dual union all
select 'Roger','Sec'      from dual union all
select 'Scott','Exec'     from dual))
select "'Sales'" as Sales,"'Exec'" as Exec,"'Sec'" as Sec,"'Manager'" as Manager
from pivot_data
pivot(max(emp_name) for job_name in ('Sales','Exec','Sec','Manager'))

SALES    EXEC    SEC    MANAGER
-------------------------------
                Roger    
        Scott        
        John        
Joe            
Steve            
        Paul        
                        Pete 

または、これで十分でない場合、この PL/SQL はあなたが望むことを行います。

declare
    cursor C1 is 
    select 'Joe' as emp_name,'Sales' as job_name from dual union all
    select 'Steve','Sales'    from dual union all
    select 'Paul','Exec'     from dual union all
    select 'Pete','Manager'  from dual union all
    select 'John','Exec'     from dual union all
    select 'Roger','Sec'      from dual union all
    select 'Scott','Exec'     from dual;
    varray_sales dbms_sql.varchar2_table;
    varray_exec dbms_sql.varchar2_table;
    varray_manager dbms_sql.varchar2_table;
    varray_sec dbms_sql.varchar2_table;
    i_sales number := 0;
    i_exec number := 0;
    i_manager number := 0;
    i_sec number := 0;
    n_line_aextr number;
    colwidth number := 30;
    line varchar2(120);
    function max_de_deux (i number,x number) return number is
    begin
        return case when i > x then i else x end;
    end;
begin
    dbms_output.enable(120);
    for l1 in c1 loop
        if L1.job_name = 'Sales' then
            i_sales := i_sales+1;
            varray_sales(i_sales) := L1.emp_name; 
        elsif L1.job_name = 'Exec' then
            i_exec := i_exec+1;
            varray_exec(i_exec) := L1.emp_name;
        elsif L1.job_name = 'Manager' then
            i_Manager := i_Manager+1;
            varray_manager(i_Manager) := L1.emp_name;
        elsif L1.job_name = 'Sec' then
            i_sec := i_sec+1;
            varray_sec(i_sec) := L1.emp_name;
        end if;
    end loop;
    dbms_output.put_line(rpad('Sales',colwidth,' ')||rpad('Exec',colwidth,' ')||rpad('Manager',colwidth,' ')
                              ||rpad('Sec',colwidth,' '));
    dbms_output.put_line(rpad('-',colwidth,'-')||rpad('-',colwidth,'-')||rpad('-',colwidth,'-')
                              ||rpad('-',colwidth,'-'));
    n_line_aextr := max_de_deux(i_manager,max_de_deux(i_sec,max_de_deux(i_sales,i_exec)));

    for l in 1..n_line_aextr loop
        line := '';
        if l <= i_sales then
            line := line || rpad(varray_sales(l),colwidth,' ');
        else 
            line := line || rpad(' ',colwidth,' ');
        end if;
        if l <= i_exec then
            line := line || rpad(varray_exec(l),colwidth,' ');
        else 
            line := line || rpad(' ',colwidth,' ');
        end if;
        if l <= i_manager then
            line := line || rpad(varray_manager(l),colwidth,' ');
        else 
            line := line || rpad(' ',colwidth,' ');
        end if;
        if l <= i_sec then
            line := line || rpad(varray_sec(l),colwidth,' ');
        else 
            line := line || rpad(' ',colwidth,' ');
        end if;
        dbms_output.put_line(line);
    end loop;                                  

end;



Sales          Exec           Manager        Sec            
------------------------------------------------------------
Joe            Paul           Pete           Roger          
Steve          John                                         
               Scott 
于 2012-11-16T16:11:18.327 に答える