【问题标题】:How to get all years between a range of begin and end date in sql oracle如何在sql oracle中获取开始日期和结束日期之间的所有年份
【发布时间】:2021-09-19 14:44:21
【问题描述】:

我有一张这样的桌子evaluations

我想通过枚举两个范围之间的所有年份将 bgn_yearend_year 转换为 eval_year。结果如下所示:

我尝试通过以下方式连接:

select  employee,
     evaluator_type,
     EVALUATOR,
     (bgn_year-1)+level as eval_year
from evaluations
connect by  (bgn_year-1)+level <=end_year

但我有很多重复的行。我可以添加一个独特的,但我不认为这是这样做的方法。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    这将是这样的(第 1 - 7 行中的示例数据;您需要的查询从第 8 行开始):

    SQL> with evaluations (employee, bgn_year, end_year, evaluator_type, evaluator)
      2  as
      3  (select 'A', 2019, 2021, 'POS1', 'X' from dual union all
      4   select 'A', 2018, 2021, 'POS2', 'Y' from dual union all
      5   select 'B', 2019, 2020, 'POS1', 'Z' from dual union all
      6   select 'B', 2020, 2021, 'POS1', 'X' from dual
      7  )
      8  select employee,
      9         --
     10         bgn_year + column_value - 1 as eval_year,
     11         --
     12         evaluator_type,
     13         evaluator
     14  from evaluations cross join
     15       table(cast(multiset(select level from dual
     16                           connect by level <= end_year - bgn_year + 1
     17                          ) as sys.odcinumberlist));
    
    EMPLOYEE    EVAL_YEAR EVALUATOR_TYPE  EVALUATOR
    ---------- ---------- --------------- ----------
    A                2019 POS1            X
    A                2020 POS1            X
    A                2021 POS1            X
    A                2018 POS2            Y
    A                2019 POS2            Y
    A                2020 POS2            Y
    A                2021 POS2            Y
    B                2019 POS1            Z
    B                2020 POS1            Z
    B                2020 POS1            X
    B                2021 POS1            X
    
    11 rows selected.
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      以下是使用标准 SQL 递归查询执行此操作的方法:

      with cte (employee, bgn_year, end_year, evaluator_type, evaluator, year) as
      (
        select employee, bgn_year, end_year, evaluator_type, evaluator, bgn_year from evaluations
        union all
        select employee, bgn_year, end_year, evaluator_type, evaluator, year + 1 from cte
        where year < end_year
      )
      select employee, year, evaluator_type, evaluator
      from cte
      order by employee, bgn_year, evaluator_type, evaluator, year;
      

      演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=588fdf9b08b7d5ac49ad830c5269eb62

      【讨论】:

        猜你喜欢
        • 2019-11-02
        • 1970-01-01
        • 2013-02-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多