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

Posted

技术标签:

【中文标题】在 Oracle SQL 中使用列名进行转置【英文标题】:Transpose using column names in Oracle SQL 【发布时间】:2020-12-22 07:23:21 【问题描述】:

我在 Oracle SQL 中的枢轴/反枢轴方面做了一些工作,但这似乎不太复杂,需要一些帮助。下面是我的餐桌设计

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 列),报告需要对读者友好

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

这里的任何帮助都是金!!!!谢谢

【问题讨论】:

【参考方案1】:

你在寻找这样的东西吗?

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

【讨论】:

宾果游戏!!!你去吧..谢谢就像一个魅力..【参考方案2】:

我会推荐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

【讨论】:

以上是关于在 Oracle SQL 中使用列名进行转置的主要内容,如果未能解决你的问题,请参考以下文章

转置列 Oracle sql

Oracle使用SQL实现矩阵转置

对列名排序后转置和添加前缀的宏

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

oracle sql 11G中如何将列转置为行

Oracle SQL 转置数据