在 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;
我会推荐 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 中的 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;
我会推荐 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