如何解决 select 查询中的单行子查询 returns 多行问题,以便以所需的方式获得结果?

How to fix single-row subquery returns more than one row issue in select query in order to achieve the result in a desired manner?

来源Table

成本类别 成本类别类型 2020 年第一季度 2020 年第二季度 2020 年第三季度 2020 年第四季度
受影响的员工 期间费用 10 20 0 4000

想要的结果

成本类别 成本类别类型 季度 价值
受影响的员工 期间成本 2020 年第一季度 10
受影响的员工 期间成本 2020 年第二季度 20
受影响的员工 期间费用 2020 年第三季度 0
受影响的员工 期间费用 2020 年第四季度 4000

我正在尝试使用以下查询

SELECT 'Q'|| LEVEL ||'-2020' AS id,
       REGEXP_SUBSTR((select ATTRIBUTE_34 || ',' || ATTRIBUTE_35 || ',' ||
                            ATTRIBUTE_36 || ',' || ATTRIBUTE_37
                       from view_form_539766),
                     '[^,]+',
                     1,
                     LEVEL) AS data
  FROM dual
CONNECT BY REGEXP_SUBSTR((select ATTRIBUTE_34 || ',' || ATTRIBUTE_35 || ',' ||
                                ATTRIBUTE_36 || ',' || ATTRIBUTE_37
                           from view_form_539766),
                         '[^,]+',
                         1,
                         LEVEL) IS NOT NULL

您可以将其写为联合查询:

Select CostCategory, CostCategoryType, 'Q1-2020' as QuarterYear, Q1-2020 as Value
from table1
union all
Select CostCategory, CostCategoryType, 'Q2-2020' as QuarterYear, Q2-2020 as Value
from table1
union all
.....

您可以使用 unpivot,它是为此类任务开发的:

with a (
  Cost_Category,
  Cost_Category_Type,
  Q1_2020,
  Q2_2020,
  Q3_2020,
  Q4_2020
) as (
  select
    'Employee Impacted',
    'Period Cost',
    10,
    20,
    0,
    4000
  from dual
)
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'
  )
)
COST_CATEGORY     | COST_CATEGORY_TYPE | QUARTER_YEAR | VALUE
:---------------- | :----------------- | :----------- | ----:
Employee Impacted | Period Cost        | Q1-2020      |    10
Employee Impacted | Period Cost        | Q2-2020      |    20
Employee Impacted | Period Cost        | Q3-2020      |     0
Employee Impacted | Period Cost        | Q4-2020      |  4000

db<>fiddle here