如何使用 Unpivot 将 Oracle 中的行转置为列,如下所示?
How to transpose row to columns in Oracle as shown below using Unpivot?
来源Table
成本类别
成本类别类型
2020 年第一季度
2020 年第二季度
2020 年第 3 季度
2020 年第四季度
受影响的员工
期间费用
10
20
0
4000
取得的成果
成本类别
成本类别类型
季度
价值
受影响的员工
期间费用
2020 年第一季度
10
受影响的员工
期间费用
2020 年第二季度
20
受影响的员工
期间费用
2020 年第三季度
0
受影响的员工
期间费用
2020 年第四季度
4000
期望的结果
成本类别
成本类别类型
季度
季度
年份
价值
受影响的员工
期间成本
2020 年第一季度
Q1
2020
10
受影响的员工
期间费用
2020 年第二季度
Q2
2020
20
受影响的员工
期间费用
2020 年第三季度
Q3
2020
0
受影响的员工
期间成本
2020 年第四季度
Q4
2020
4000
我已经能够使用下面的查询实现上面的 table 2,但不确定如何添加季度和年份列,如 table 3
所示
with a (
Cost_Category,
Cost_Category_Type,
Q1_2020,
Q2_2020,
Q3_2020,
Q4_2020
) as (
select
'Employee Impacted',
'Period Cost',
ATTRIBUTE_34,
ATTRIBUTE_35,
ATTRIBUTE_36,
ATTRIBUTE_37
from view_form_539766
)
select *
from a
unpivot (
value
for Quarter_Year in (
q1_2020 as 'Q1-2020',
q2_2020 as 'Q2-2020',
q3_2020 as 'Q3-2020',
q4_2020 as 'Q4-2020',
)
)
使用另一个 CTE。在我的查询中,您当前的“解决方案”是 temp
CTE;那么提取季度和年份就很简单了。
SQL> WITH
2 a (cost_category,
3 cost_category_type,
4 q1_2020,
5 q2_2020,
6 q3_2020,
7 q4_2020)
8 AS
9 (SELECT 'Employee Impacted', 'Period cost', 10, 20, 0, 4000 FROM DUAL),
10 temp
11 AS
12 (SELECT *
13 FROM a
14 UNPIVOT (VALUE
15 FOR quarter_year
16 IN (q1_2020 AS 'Q1-2020',
17 q2_2020 AS 'Q2-2020',
18 q3_2020 AS 'Q3-2020',
19 q4_2020 AS 'Q4-2020')))
20 SELECT t.cost_category,
21 t.cost_category_type,
22 t.quarter_year,
23 SUBSTR (t.quarter_year, 1, 2) quarter,
24 SUBSTR (t.quarter_year, 4) year,
25 t.VALUE
26 FROM temp t
27 /
COST_CATEGORY COST_CATEGO QUARTER QUARTER YEAR VALUE
----------------- ----------- ------- -------- ---- ----------
Employee Impacted Period cost Q1-2020 Q1 2020 10
Employee Impacted Period cost Q2-2020 Q2 2020 20
Employee Impacted Period cost Q3-2020 Q3 2020 0
Employee Impacted Period cost Q4-2020 Q4 2020 4000
SQL>
来源Table
成本类别 | 成本类别类型 | 2020 年第一季度 | 2020 年第二季度 | 2020 年第 3 季度 | 2020 年第四季度 |
---|---|---|---|---|---|
受影响的员工 | 期间费用 | 10 | 20 | 0 | 4000 |
取得的成果
成本类别 | 成本类别类型 | 季度 | 价值 |
---|---|---|---|
受影响的员工 | 期间费用 | 2020 年第一季度 | 10 |
受影响的员工 | 期间费用 | 2020 年第二季度 | 20 |
受影响的员工 | 期间费用 | 2020 年第三季度 | 0 |
受影响的员工 | 期间费用 | 2020 年第四季度 | 4000 |
期望的结果
成本类别 | 成本类别类型 | 季度 | 季度 | 年份 | 价值 |
---|---|---|---|---|---|
受影响的员工 | 期间成本 | 2020 年第一季度 | Q1 | 2020 | 10 |
受影响的员工 | 期间费用 | 2020 年第二季度 | Q2 | 2020 | 20 |
受影响的员工 | 期间费用 | 2020 年第三季度 | Q3 | 2020 | 0 |
受影响的员工 | 期间成本 | 2020 年第四季度 | Q4 | 2020 | 4000 |
我已经能够使用下面的查询实现上面的 table 2,但不确定如何添加季度和年份列,如 table 3
所示with a (
Cost_Category,
Cost_Category_Type,
Q1_2020,
Q2_2020,
Q3_2020,
Q4_2020
) as (
select
'Employee Impacted',
'Period Cost',
ATTRIBUTE_34,
ATTRIBUTE_35,
ATTRIBUTE_36,
ATTRIBUTE_37
from view_form_539766
)
select *
from a
unpivot (
value
for Quarter_Year in (
q1_2020 as 'Q1-2020',
q2_2020 as 'Q2-2020',
q3_2020 as 'Q3-2020',
q4_2020 as 'Q4-2020',
)
)
使用另一个 CTE。在我的查询中,您当前的“解决方案”是 temp
CTE;那么提取季度和年份就很简单了。
SQL> WITH
2 a (cost_category,
3 cost_category_type,
4 q1_2020,
5 q2_2020,
6 q3_2020,
7 q4_2020)
8 AS
9 (SELECT 'Employee Impacted', 'Period cost', 10, 20, 0, 4000 FROM DUAL),
10 temp
11 AS
12 (SELECT *
13 FROM a
14 UNPIVOT (VALUE
15 FOR quarter_year
16 IN (q1_2020 AS 'Q1-2020',
17 q2_2020 AS 'Q2-2020',
18 q3_2020 AS 'Q3-2020',
19 q4_2020 AS 'Q4-2020')))
20 SELECT t.cost_category,
21 t.cost_category_type,
22 t.quarter_year,
23 SUBSTR (t.quarter_year, 1, 2) quarter,
24 SUBSTR (t.quarter_year, 4) year,
25 t.VALUE
26 FROM temp t
27 /
COST_CATEGORY COST_CATEGO QUARTER QUARTER YEAR VALUE
----------------- ----------- ------- -------- ---- ----------
Employee Impacted Period cost Q1-2020 Q1 2020 10
Employee Impacted Period cost Q2-2020 Q2 2020 20
Employee Impacted Period cost Q3-2020 Q3 2020 0
Employee Impacted Period cost Q4-2020 Q4 2020 4000
SQL>