Split a row into multiple rows based on a Date Range
Teradata Teradata Discussion Forums Teradata.com Discussion Forum
Visit Teradata.com
Home       Guidelines    Member List
Welcome Guest ( Login | Register )
        


This online forum is for user-to-user discussions of Teradata products, and is not an official customer support channel for Teradata. If you require direct assistance, please contact Teradata support.


Split a row into multiple rows based on a... Expand / Collapse
Author
Message
Posted 8/25/2006 8:42:39 PM
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

Group: Forum Members
Last Login: 5/19/2008 11:39:33 AM
Posts: 29, Visits: 19
Hi,

I am selecting data from a table which has Start Date and End Date as follows

Emp Start Date End Date
10 01/01/2006 12/31/2006
20 05/01/2005 12/31/2005

I want to results as follows
Emp Months
10 Jan 06
10 Feb 06
10 Mar 06
.
.
.
10 Dec-06
20 May-05
20 Jun-05
.
.
.
20 Dec-05

Basically want to split a employee record into each month that the employee was present.

Please help

Sam


 

Sam

Post #4986
Posted 8/27/2006 7:03:34 AM
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

Group: Forum Members
Last Login: 2 days ago @ 3:41:05 AM
Posts: 522, Visits: 264
Hi Sam,

create table sam
(Emp int, Start_date Date, End_date Date);

insert into sam values(10, date '2006-01-01', date '2006-12-31');
insert into sam values(20, date '2005-05-01', date '2005-12-31');

/*** instead of sys_calendar.calendar use your company's business calendar ***/
select
emp,
trim(calendar_date (format 'mmm-yy'))
from sam cross join
sys_calendar.calendar c
where calendar_date between start_date and end_date
and day_of_month = 1
order by
emp,
calendar_date
;

/*** In V2R6 there's an nice recursive solution with a "Commmon Table Expression" ***/
with recursive cte (emp, start_date, end_date) as
(
select
emp,
start_date,
end_date
from sam

union all

select
emp,
add_months(start_date, 1) as newstart,
end_date
from cte
where newstart < end_date
)
select
emp,
trim(start_date (format 'mmm-yy'))
from cte
order by
emp,
start_date
;


Dieter
Post #4990
Posted 8/27/2006 2:12:01 PM
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

Group: Forum Members
Last Login: 5/19/2008 11:39:33 AM
Posts: 29, Visits: 19
Thanks Dieter!!!

Both the sql's work gr8.

From the performance perspective which one is the better of the 2.

Thanks,
Sam



 

Sam

Post #4993
Posted 8/27/2006 2:41:51 PM
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

Group: Forum Members
Last Login: 2 days ago @ 3:41:05 AM
Posts: 522, Visits: 264
Hi Sam,
i can't tell you which is more efficient, you'll have to test it with your data.

It probably depends on:

number of rows in your calendar table to be cross joined
vs.
number of recursion levels

Dieter
Post #4994
Posted 8/27/2006 2:50:01 PM
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

Group: Forum Members
Last Login: 5/19/2008 11:39:33 AM
Posts: 29, Visits: 19
Thanks Once Again!

Those sql's were damn good!


 

Sam

Post #4995
« Prev Topic | Next Topic »


Reading This Topic Expand / Collapse
Active Users: 0 ( 0 guests, 0 members, 0 anonymous members )
No members currently viewing this topic.


All times are GMT -5:00, Time now is 5:21am

Powered By InstantForum.NET v4.1.4 © 2008
Execution: 0.063. 7 queries. Compression Disabled.