在 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 中使用列名进行转置的主要内容,如果未能解决你的问题,请参考以下文章