首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL将行转换为分组列

PL/SQL将行转换为分组列
EN

Stack Overflow用户
提问于 2012-11-16 01:56:10
回答 1查看 1.4K关注 0票数 2

我不知道如何表达这个问题,但我正在尝试将一个行值转换为PL/SQL中的列。我不是新手,但我不知道该怎么做。我有以下表格数据:

公司名称-再保险责任

商品、商品等

公司的转轨销售

/

皮特-阿肯-成品油

 /T1357-1993工业用成本法

陆观豪.

Scott-成品率

我需要创建一个查询,该查询将按如下方式返回和显示数据:

成品油,成品油,成品油

 /T1459.2-1988商业、技术、工业等

斯蒂夫(Steve)

我面临的问题是,无论如何,行数据并不是相互关联的。这能办到吗?

我很感谢任何人能在这方面提供的帮助。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-11-16 16:11:18

首先,最好在future.For示例中给出您的数据库版本,如果您有Oracle11g,即使它不是很好,您想要的也可以用枢轴做一些类似的事情。

代码语言:javascript
复制
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可以做您想做的事情。我在11g上测试了它,并且我相当肯定它可以与10g的ET9i一起工作,但是我不能保证DB2或PostGre能做任何事情:

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13409299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档