Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Qlik Open Lakehouse is Now Generally Available! Discover the key highlights and partner resources here.
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Week off /leave Calculation

Hi All,

Please help me in finding the week off / leave for the dealers.

For example dealer A week off is on sunday as on 01-Jan- 2014 and again dealer is changing sunday to monday as week off from 07-Jan-2014.I need to have calendar marking sunday as leave from 01-Jan to 12 - Jan , since 07 is falling on tuesday i need to update monday as leave in the next week data

Sample Data :

Dealer, Date,WeekDay

A,01-Jan-2014,Sunday

A,07-Jan-2014,Monday

My output should be

DealerDateWeekDayDayCountWeek off
A01-Jan-2014Wednesday1
A02-Jan-2014Thursday1
A03-Jan-2014Friday1
A04-Jan-2014Saturday1
A05-Jan-2014Sunday01
A06-Jan-2014Monday1
A07-Jan-2014Tuesday1
A08-Jan-2014Wednesday1
A09-Jan-2014Thursday1
A10-Jan-2012Friday1
A11-Jan-2014Saturday1
A12-Jan-2014Sunday1
A13-Jan-2014Monday01

Thanks in advance

1 Solution

Accepted Solutions
preminqlik
Specialist II
Specialist II

hi there,

try this (you can also do in subroutines using procedures but as per now try this )

Data:

LOAD Dealer,Date(Date#(Date,'DD-MMM-YYYY')) as Date,WeekDay INLINE [

    Dealer, Date,WeekDay

A,01-Jan-2014,Sunday

A,07-Jan-2014,Monday

B,31-Jan-2014,Friday

];

DATASTAGE2:

LOAD

  num(YearStart(today()))+IterNo()-1 AS Num,

  Date(num(YearStart(today()))+IterNo()-1) AS Date

AUTOGENERATE 1 WHILE num(YearStart(today()))+IterNo()-1<= num(Yearend(today()));

Join

Load Distinct Dealer

Resident Data;

DATASTAGE3:

NoConcatenate

LOAD *

Resident DATASTAGE2;

Join

Load *

Resident Data;

drop table Data;

drop table DATASTAGE2;

STAGE3:

Load *,

text(Date(Date,'WWWWWW')) as WEEKDAY,

if(text(Date(Date,'WWW'))=Capitalize(Trim(left(NewWeekDay,3))),0,1) as DAYCOUNT,

if(text(Date(Date,'WWW'))=Capitalize(Trim(left(NewWeekDay,3))),1,0) as WEEKOFF;

Load *,

if(len(Dealer)>0,if(Peek(Dealer)=Dealer,if(len(WeekDay)>0,WeekDay,peek('NewWeekDay')),if(len(WeekDay)>0,WeekDay,'Sunday'))) as NewWeekDay

Resident DATASTAGE3 Order by Dealer,Date asc;

DROP table DATASTAGE3;

exit script;

View solution in original post

5 Replies
preminqlik
Specialist II
Specialist II

hi there, hope this helps you

Data:

LOAD Dealer,Date(Date#(Date,'DD-MMM-YYYY')) as Date,WeekDay INLINE [

    Dealer, Date,WeekDay

    A,01-Jan-2014,Sunday

    A,07-Jan-2014,Monday

];

DATASTAGE2:

LOAD

  num(YearStart(today()))+IterNo()-1 AS Num,

  Date(num(YearStart(today()))+IterNo()-1) AS Date

AUTOGENERATE 1 WHILE num(YearStart(today()))+IterNo()-1<= num(Yearend(today()));

Join

Load *

Resident Data;

drop table Data;

STAGE3:

Load *,

text(Date(Date,'WWWWWW')) as WEEKDAY,

if(text(Date(Date,'WWW'))=Capitalize(Trim(left(NewWeekDay,3))),0,1) as DAYCOUNT,

if(text(Date(Date,'WWW'))=Capitalize(Trim(left(NewWeekDay,3))),1,0) as WEEKOFF;

Load *,

if(len(Dealer)>0,Dealer,peek('DEALER')) as DEALER,

if(len(WeekDay)>0,WeekDay,peek('NewWeekDay')) as NewWeekDay

Resident DATASTAGE2 Order by Date asc;

DROP table DATASTAGE2;

EXIT Script;

EXIT Script;

its_anandrjs
Champion III
Champion III

Hi,

You can try this way

tmp1Data:

LOAD

Num(Date(Date#(Date,'DD-MMM-YYYY'),'DD-MMM-YYYY')) as NumDate,

Date(Date#(Date,'DD-MMM-YYYY'),'DD-MMM-YYYY') as Date,

Dealer,WeekDay as WeekDay_Field;

LOAD * Inline

[

Dealer, Date,WeekDay

A,01-Jan-2014,Sunday

A,07-Jan-2014,Monday

];

LET vMinDate = Peek('NumDate',0,'tmp1Data');

Join

tmp2Data:

LOAD Distinct

Dealer,

Date($(vMinDate) + IterNo() -1,'DD-MMM-YYYY') as Date,

(Date($(vMinDate) + IterNo() -1,'WWWWWW')) as WeekDayNew

Resident tmp1Data

While  Num(Date(Date#(Date,'DD-MMM-YYYY'),'DD-MMM-YYYY')) + IterNo()-1 <=

       Num(Date(Date#('31-Dec-2014','DD-MMM-YYYY'),'DD-MMM-YYYY'));

DROP Field NumDate;

Final:

NoConcatenate

LOAD *,

if(Flag=WeekDayNew,1,0) as WeekOff,

if(Flag=WeekDayNew,0,1) as DayCount;

LOAD *,

if(len(WeekDay_Field)>0,WeekDay_Field,Peek('Flag')) as Flag

Resident tmp1Data Order By Date asc;

DROP Table tmp1Data;

You can create the same calendar for Min date to Max date here i make it upto 31/12/2014

And as output you get

weekoff.png

Regards

Anand

Anonymous
Not applicable
Author

Hi,

Thanks to both of you for replying.

@Prem

Iam getting the correct answer as i expected , but if add another dealer its showing in correct result.

Its works perfect for single dealer

Example

Sample Data :

Dealer, Date,WeekDay

A,01-Jan-2014,Sunday

A,07-Jan-2014,Monday

B,31-Jan-2014,Friday

O/p should be

A - All dates from -1Jan - 31 Dec and week off data , sunday and monday

B- All dates from -1Jan - 31 Dec and week off data , friday

Thanks a lot


preminqlik
Specialist II
Specialist II

hi there,

try this (you can also do in subroutines using procedures but as per now try this )

Data:

LOAD Dealer,Date(Date#(Date,'DD-MMM-YYYY')) as Date,WeekDay INLINE [

    Dealer, Date,WeekDay

A,01-Jan-2014,Sunday

A,07-Jan-2014,Monday

B,31-Jan-2014,Friday

];

DATASTAGE2:

LOAD

  num(YearStart(today()))+IterNo()-1 AS Num,

  Date(num(YearStart(today()))+IterNo()-1) AS Date

AUTOGENERATE 1 WHILE num(YearStart(today()))+IterNo()-1<= num(Yearend(today()));

Join

Load Distinct Dealer

Resident Data;

DATASTAGE3:

NoConcatenate

LOAD *

Resident DATASTAGE2;

Join

Load *

Resident Data;

drop table Data;

drop table DATASTAGE2;

STAGE3:

Load *,

text(Date(Date,'WWWWWW')) as WEEKDAY,

if(text(Date(Date,'WWW'))=Capitalize(Trim(left(NewWeekDay,3))),0,1) as DAYCOUNT,

if(text(Date(Date,'WWW'))=Capitalize(Trim(left(NewWeekDay,3))),1,0) as WEEKOFF;

Load *,

if(len(Dealer)>0,if(Peek(Dealer)=Dealer,if(len(WeekDay)>0,WeekDay,peek('NewWeekDay')),if(len(WeekDay)>0,WeekDay,'Sunday'))) as NewWeekDay

Resident DATASTAGE3 Order by Dealer,Date asc;

DROP table DATASTAGE3;

exit script;

Anonymous
Not applicable
Author

Hi Prem,

Perfect

Thanks a lot this what iam looking for