我有一个表格,它会给我姓名和开始日期。使用这个我需要从开始日期到日期获取包含姓名和月结束日期行的记录。 我的基本表格如下所示
Name | Start_date
Fly | 01-Jul-16
我的输出如下
Name Start_date
Fly| 31-Jul-16
Fly 31-Aug-16
Fly 30-Sep-16
Fly 31-Oct-16
Fly 30-Nov-16
Fly 31-Dec-16
Fly 31-Jan-17
Fly 28-Feb-17
Fly 31-Mar-17
Fly 30-Apr-17
Fly 31-May-17
Fly 30-Jun-17
Fly 31-Jul-17
Fly 31-Aug-17
我尝试了几个按层次使用连接并使用了最后一天函数的东西,但是该表没有加入基本表的名称。我的表中有超过100个名称。请求指导。< / p>
答案 0 :(得分:2)
如果您有多个名称和一个日期,以下是如何执行此操作,但仅当输入名称不同时才有效。 (否则可以修改查询以适应非唯一名称。)
奇怪您希望将月末日期称为start_date
,与输入数据中的相同。此外,name
是Oracle关键字,不应将其用作列名。我会让你处理这两个问题。
with
test_data ( name, start_date ) as (
select 'Fly', to_date('01-Jul-16', 'dd-Mon-yy') from dual union all
select 'Two', to_date('15-Feb-17', 'dd-Mon-yy') from dual
)
-- End of simulated inputs (for testing only, not part of the solution).
-- Use your actual table and column names in the SQL below.
select name, add_months(last_day(start_date), level - 1) as start_date
from test_data
connect by add_months(last_day(start_date), level - 1) <= last_day(sysdate)
and prior name = name
and prior sys_guid() is not null
order by name, start_date
;
<强>输出强>:
NAME START_DATE
--- ----------
Fly 31-Jul-16
Fly 31-Aug-16
Fly 30-Sep-16
Fly 31-Oct-16
Fly 30-Nov-16
Fly 31-Dec-16
Fly 31-Jan-17
Fly 28-Feb-17
Fly 31-Mar-17
Fly 30-Apr-17
Fly 31-May-17
Fly 30-Jun-17
Fly 31-Jul-17
Fly 31-Aug-17
Two 28-Feb-17
Two 31-Mar-17
Two 30-Apr-17
Two 31-May-17
Two 30-Jun-17
Two 31-Jul-17
Two 31-Aug-17