【问题标题】: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?如何修复单行子查询在选择查询中返回多行问题以便以所需的方式获得结果?
【发布时间】:2021-09-15 06:01:55
【问题描述】:

源表

Cost Category Cost Category Type Q1-2020 Q2-2020 Q3-2020 Q4-2020
Employee Impacted Period Cost 10 20 0 4000

想要的结果

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

我正在尝试使用以下查询

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

【问题讨论】:

    标签: sql database oracle oracle11g oracle10g


    【解决方案1】:

    你可以把它写成联合查询:

    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
    .....
    

    【讨论】:

    • 不幸的是,我必须使用联合从 2013 年第一季度到 2025 年第四季度获取数据,这会导致查询成本增加
    【解决方案2】:

    您可以使用为此类任务开发的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_TYPE | QUARTER_YEAR |价值 :---------------- | :----------------- | :----------- | ----: 员工受影响 |期间费用 | 2020 年第一季度 | 10 员工受影响 |期间费用 | 2020 年第二季度 | 20 员工受影响 |期间费用 | 2020 年第三季度 | 0 员工受影响 |期间费用 | 2020 年第四季度 | 4000

    db小提琴here

    【讨论】:

    • 谢谢,如果可以的话,请建议如何仅在指定的开始季度和结束季度之间包含行的转置,例如,如果它位于两列之间,则应包含“Q2-2019”具有相同格式的开始季度值和结束季度。我已经使用 add_months(to_date('0101'||substr('Q2-2013',4),'MM-DD-YYYY'),(substr('Q2-2013',2,1)- 1)*3)为了比较,这里不知道怎么用,如果可以请建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2020-12-28
    • 2017-09-12
    • 1970-01-01
    • 2020-11-19
    • 2020-09-27
    相关资源
    最近更新 更多