Oracle - 在范围内每个日期返回一列

时间:2018-02-20 22:36:22

标签: oracle date pivot

我们说我有表A:援助

PersonID        Date           CHECK
123456       2012-01-01          F
213415       2012-01-03          A

PersonID    ArrivalDate       Jan-01    Jan-02    Jan-03    
123456       2012-01-01          F       NULL      NULL         
213415       2012-01-03         NULL     NULL       A          

系统用于支票,1到15天但不超过1天。任何想法都会非常感激。

2 个答案:

答案 0 :(得分:0)

你可以尝试这个,但我不确定这是否是你需要的,

with inputs_
  as (select 123456 person_id, to_date('2012-01-01', 'YYYY-MM-DD') date_, 'F' check_
       from dual
      union all
      select 213415 person_id, to_date('2012-01-03', 'YYYY-MM-DD'), 'A' check_
        from dual
      UNION ALL
      select 123456 person_id, to_date('2012-01-01', 'YYYY-MM-DD') date_, 'F' check_
       from dual
      union all
      select 213415 person_id, to_date('2012-01-03', 'YYYY-MM-DD'), 'A' check_
        from dual
      union all
      select 123456 person_id, to_date('2012-01-04', 'YYYY-MM-DD') date_, 'F' check_
       from dual
      union all
      select 213415 person_id, to_date('2012-01-05', 'YYYY-MM-DD'), 'A' check_
        from dual
      union all
      select 123456 person_id, to_date('2012-01-02', 'YYYY-MM-DD') date_, 'A' check_
       from dual
      union all
      select 213415 person_id, to_date('2012-01-04', 'YYYY-MM-DD'), 'A' check_
        from dual
      UNION ALL
      select 213415 person_id, to_date('2012-01-02', 'YYYY-MM-DD'), 'F' check_
        from dual)
     select *
       from (select  person_id, date_ arrival_date, check_, TO_CHAR(date_, 'DD-MON') date_
               from inputs_)
              pivot (min(check_) for date_ in ('01-JAN', '02-JAN', '03-JAN', '04-JAN', '05-JAN')
             )
       order by 2;

输出:

enter image description here

此外,这不是动态的,因此如果您想要动态支点,可以看到此链接,Dynamic pivot in oracle sql

答案 1 :(得分:0)

您可以使用查询为{min}日期到最大日期的PIVOT IN子句构建动态日期值。然后在IN的{​​{1}}子句中打开包含所需参数的动态游标。 PIVOT(12c及更高版本)将显示所需的结果。 对于旧版本,您可以在此处参考我的答案,以便轻松显示光标的输出:Display result

DBMS_SQL.RETURN_RESULT