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

Announcements
Join us to spark ideas for how to put the latest capabilities into action. Register here!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Flag working days per project

I have an qv app that gets data from two tables (simplified):

- Projects (ProjectID, Name)

- Hours (ProjectID, Date, bookedHours)

I'd like to autogenerate a third table in my script that list all the days between the first date with booked hours on a project until the last day. The records should contain a flag which says if there are booked hours on this day for this project.

Eg.

Projects:

ProjectID     Name

1                    Project1

2                    Project2

Hours:

ProjectID          Date               Bookedhours

1                      01/01/2014          6

1                      01/03/2014          4

2                      01/03/2014          3

2                      01/06/2014          2

Autogenerated table should look this:

Workdays:

ProjectID          Date               Workday

1                         01/01/2014     1

1                         01/02/2014     0

1                         01/03/2014     1

2                         01/03/2014     1

2                         01/04/2014     0

2                         01/05/2014     0

2                         01/06/2014     1

I have no clue how this can be done. Any help will be appreciated.

Thanks!

1 Solution

Accepted Solutions
MK_QSL
MVP
MVP

Please make sure that your set your Date format in the script editor as below...

SET DateFormat='MM/DD/YYYY';

SET TimestampFormat='MM/DD/YYYY hh:mm:ss[.fff]';

=========================================

Projects:

LOAD * Inline

[

  ProjectID, Name

  1, Project1

  2, Project2

];

Hours:

Load * Inline

[

  ProjectID,Date,Bookedhours

  1,01/01/2014,6

  1,01/03/2014,4

  2,01/03/2014,3

  2,01/06/2014,2

];

NoConcatenate

Temp1:

Load

  ProjectID,

  Date(Min(Date)) as MinDate,

  Date(Max(Date)) as MaxDate

Resident Hours

Group By ProjectID;

Temp2:

Load

  ProjectID,

  Date(MinDate + IterNo() - 1) as Date

Resident Temp1

While MinDate + IterNo() - 1 <= MaxDate;

Join

Load * Resident Hours;

Final:

Load

  ProjectID,

  IF(IsNull(Bookedhours) or LEN(TRIM(Bookedhours))=0, 0,1) as Flag,

  Bookedhours,

  Date

Resident Temp2;

Drop Tables Temp1, Temp2, Hours;

=====================================

View solution in original post

3 Replies
MK_QSL
MVP
MVP

Please make sure that your set your Date format in the script editor as below...

SET DateFormat='MM/DD/YYYY';

SET TimestampFormat='MM/DD/YYYY hh:mm:ss[.fff]';

=========================================

Projects:

LOAD * Inline

[

  ProjectID, Name

  1, Project1

  2, Project2

];

Hours:

Load * Inline

[

  ProjectID,Date,Bookedhours

  1,01/01/2014,6

  1,01/03/2014,4

  2,01/03/2014,3

  2,01/06/2014,2

];

NoConcatenate

Temp1:

Load

  ProjectID,

  Date(Min(Date)) as MinDate,

  Date(Max(Date)) as MaxDate

Resident Hours

Group By ProjectID;

Temp2:

Load

  ProjectID,

  Date(MinDate + IterNo() - 1) as Date

Resident Temp1

While MinDate + IterNo() - 1 <= MaxDate;

Join

Load * Resident Hours;

Final:

Load

  ProjectID,

  IF(IsNull(Bookedhours) or LEN(TRIM(Bookedhours))=0, 0,1) as Flag,

  Bookedhours,

  Date

Resident Temp2;

Drop Tables Temp1, Temp2, Hours;

=====================================

Not applicable
Author

Hi Jan,

take a glance at my suggestion:

Hours:

LOAD * Inline [

ProjectID,Date, Bookedhours

1,01.01.2014,6

1,01.03.2014,4

2,01.03.2014,3

2,01.06.2014,2

];

Projects:

Left Join (Hours)

LOAD * Inline [

ProjectID,Name

1,Project1

2,Project2

];

// Now creating calender and Workdays:

Concatenate

LOAD

    ProjectID,

    0    AS Bookedhours,

    1    AS WorkDay,

    Name,

    date(Date+ IterNo()) AS Date

Resident Hours

While not Exists(Date, Date+IterNo()) and Date < ('01.06.2014') // Maxdate hardcoded for timereasons, should be easy get it input

;   

HtH

Roalnd

Not applicable
Author

Thanks!

I did a modification to the join on the temp2 table and it worked:

Temp2:

Load

  ProjectID,

  Date(MinDate + IterNo() - 1) as Date

Resident Temp1

While MinDate + IterNo() - 1 <= MaxDate;

Left Join(Temp2)

Load

  ProjectID,

  Date,

  Sum(Bookedhours) as Workinghours

  Resident Hours

  Group By Date, ProjectID;