在 Oracle SQL 中使用列名进行转置

Transpose using column names in Oracle SQL

我在 Oracle SQL 中的 pivot/unpivot 工作过一些,但是这个似乎有点复杂,在这里需要一些帮助。下面是我的table设计

year Comp_A_prev_yr_due_ct Comp_A_prev_yr_due_amt Comp_A_curr_yr_due_ct Comp_A_Curr_yr_due_amt
2019 100 1000 101 1001

就像这样,我有多个公司作为列(每个列有 4 个),报告需要有点 reader 友好

Company year due_ct due_amt prev_or_curr
A 2019 100 1000 prev
A 2019 101 1001 cur

任何帮助都是金子!!!!谢谢

您在找这样的东西吗?

SELECT regexp_substr(company_prev_curr, '(.*?_){1}(.*?)_', 1, 1,'', 2) AS company
    ,year
    ,due_ct
    ,due_amt
    ,regexp_substr(company_prev_curr, '(.*?_){2}(.*?)_', 1, 1,'', 2) AS prev_curr
FROM test
unpivot(
        (due_ct,due_amt) 
         FOR company_prev_curr IN (
            (Comp_A_prev_yr_due_ct,Comp_A_prev_yr_due_amt),
            (Comp_A_curr_yr_due_ct,Comp_A_Curr_yr_due_amt)
            )
        ) u;

Demo on db<>fiddle

我会推荐 cross apply:横向连接是许多数据库都支持的有用且高效的功能。在 Oracle 中(假设是 12c 或更高版本):

select t.year, x.*
from mytable t
cross apply (
    select 
        'A'                    as company, 
        comp_a_prev_yr_due_ct  as due_ct, 
        comp_a_prev_yr_due_amt as due_amt, 
        'prev'                 as prev_or_cur 
    from dual
    union all
    select 'A', comp_a_cur_yr_due_ct as due_ct, comp_a_cur_yr_due_amt, 'cur' from dual
) x