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: 
Not applicable

table conversion

Hi,

At the moment we have this table:

error loading image

This is a table with turn-around-times for the radiology department.

SLEUTEL = KEY

PLANUITVOERING = startdate/hour

LS_INSERTDATE = enddate/hour (this is actually the time when the status of the examination changes)

doorlooptijd2 = Turn-around-time

LS_STATUS = status of the examination.

In the table above you can see all status changes for every examination.

Now we would like to create a second table (during reload) that looks like this:

(this is just a quick example i made in Excel)

error loading image

The first problem is, as you can see in the first image, is that one key can have multiple times the same status (lika SLEUTEL = 1890495).

So I have allready created a small table that counts the maximum time that every status occurs in my table.

But that's where i'm stuck, I'm not getting any further.

Anyone can help?

Thanks in advance!

1 Solution

Accepted Solutions
Not applicable
Author

Finally found a solution 🙂

I'm just gonna paste it here, maybe it will come in handy for someone else later.

I'm sorry but the comments are in Dutch..

//Inlezen FACT tabel
Radiologie:
LOAD distinct SLEUTEL,
PLANUITVOERING,
LS_INSERTDATE,
LS_STATUS,
1 as Counter
resident FACT;

//Tabel met alle voorkomende statussen
Statussen:
Load distinct
LS_STATUS as Status
resident Radiologie
where isnull(LS_STATUS) = 0;

//Tel het aantal statussen
LET nrSTATUSSEN = noofrows('Statussen')-1;

//Resident load van de FACT tabel, maar in volgorde van statussen zodat deze tabel gesorteerd staat op SLEUTEL en LS_STATUS
//Dit moet want anders werkt de Counter niet goed bij het laden van OnderzoekStatussen_temp
FOR rowStatus = 0 TO $(nrSTATUSSEN)
LET S = peek('Status',rowStatus,'Statussen');
StatussenTijd:
LOAD SLEUTEL,
LS_INSERTDATE,
LS_STATUS,
Counter
RESIDENT Radiologie
WHERE LS_STATUS = '$(S)'
order by SLEUTEL ASC, LS_INSERTDATE ASC;
NEXT

//Resident load van de FACT tabel, enkel de SLEUTEL en PLANUITVOERING worden ingelezen, hier worden daarna
//de rest bij gejoined (left join)
OnderzoekStatussen:
LOAD distinct SLEUTEL,
PLANUITVOERING as Start_PLANUITVOERING
RESIDENT Radiologie
order by SLEUTEL;

//Resident load van StatussenTijd (die gesorteerd is op SLEUTEL en LS_STATUS), en hier wordt nu ook een teller bijgevoegd
//die controlleert de hoeveelste keer dat een bepaalde sleutel dezelfde status krijgt
//Eerst laad ik hem in voor de eerste status (positie 0 in de tabel Statussen) omdat ik met een concatenate load moet werken doordat
//per keer de for lus doorloopen wordt een anders veld wordt gemaakt, $(S). En je kan enkel een concatenate load doen op een reeds
//bestaande tabel
OnderzoekStatussen_temp:
LET S = peek('Status',0,'Statussen');
LOAD SLEUTEL,
IF(SLEUTEL = peek(SLEUTEL),peek(Counter)+1,1) AS Counter,
LS_INSERTDATE as $(S),
LS_STATUS
RESIDENT StatussenTijd
WHERE LS_STATUS = '$(S)';

FOR rowStatus = 1 TO $(nrSTATUSSEN)
LET S = peek('Status',rowStatus,'Statussen');
Concatenate LOAD SLEUTEL,
IF(SLEUTEL = peek(SLEUTEL),peek(Counter)+1,1) AS Counter,
LS_INSERTDATE as $(S),
LS_STATUS
RESIDENT StatussenTijd
WHERE LS_STATUS = '$(S)';
NEXT

//Een tabel met alle waarden voor Counter
Counters:
Load distinct Counter as Teller
resident OnderzoekStatussen_temp
where isnull(Counter) = 0;

//Tel het aantal Counters
LET nrCOUNTERS = noofrows('Counters')-1;

//Resident load van de OnderzoekStatussen_temp om de Status samen te voegen met zijn Counter,
//zo krijg je VL1, VL2, VL3, IL,1, IL2, ...
FOR rowStatus = 0 TO $(nrSTATUSSEN)
FOR rowCounter = 0 TO $(nrCOUNTERS)
LET S = peek('Status',rowStatus,'Statussen');
LET C = peek('Teller',rowCounter,'Counters');
left join (OnderzoekStatussen)
load
SLEUTEL,
$(S) as $(S)$(C)
resident OnderzoekStatussen_temp
WHERE LS_STATUS = '$(S)' and Counter = $(C);
Next
Next

DROP TABLES
Radiologie
,OnderzoekStatussen_temp
,StatussenTijd
,Counters
,Statussen
;


View solution in original post

3 Replies
prieper
Master II
Master II

Would be nicer, if you could have added some data, not a picture ....

load the table
sort it by Sleutel, LS_STATUS and Planuitvoering ASC
add a field with formula IF(Sleutel = PREVIOUS(Sleutel) AND LS_STATUS <> PREVIOUS(LS_STATUS), 1, PREVIOUS(Counter) + 1) AS Counter
Concatenate the field Counter with LS_STATUS
Create a CROSSTAB

HTH
Peter

Not applicable
Author

Thank you for the reply!

I made a QVD with the data from my table.

Not applicable
Author

Finally found a solution 🙂

I'm just gonna paste it here, maybe it will come in handy for someone else later.

I'm sorry but the comments are in Dutch..

//Inlezen FACT tabel
Radiologie:
LOAD distinct SLEUTEL,
PLANUITVOERING,
LS_INSERTDATE,
LS_STATUS,
1 as Counter
resident FACT;

//Tabel met alle voorkomende statussen
Statussen:
Load distinct
LS_STATUS as Status
resident Radiologie
where isnull(LS_STATUS) = 0;

//Tel het aantal statussen
LET nrSTATUSSEN = noofrows('Statussen')-1;

//Resident load van de FACT tabel, maar in volgorde van statussen zodat deze tabel gesorteerd staat op SLEUTEL en LS_STATUS
//Dit moet want anders werkt de Counter niet goed bij het laden van OnderzoekStatussen_temp
FOR rowStatus = 0 TO $(nrSTATUSSEN)
LET S = peek('Status',rowStatus,'Statussen');
StatussenTijd:
LOAD SLEUTEL,
LS_INSERTDATE,
LS_STATUS,
Counter
RESIDENT Radiologie
WHERE LS_STATUS = '$(S)'
order by SLEUTEL ASC, LS_INSERTDATE ASC;
NEXT

//Resident load van de FACT tabel, enkel de SLEUTEL en PLANUITVOERING worden ingelezen, hier worden daarna
//de rest bij gejoined (left join)
OnderzoekStatussen:
LOAD distinct SLEUTEL,
PLANUITVOERING as Start_PLANUITVOERING
RESIDENT Radiologie
order by SLEUTEL;

//Resident load van StatussenTijd (die gesorteerd is op SLEUTEL en LS_STATUS), en hier wordt nu ook een teller bijgevoegd
//die controlleert de hoeveelste keer dat een bepaalde sleutel dezelfde status krijgt
//Eerst laad ik hem in voor de eerste status (positie 0 in de tabel Statussen) omdat ik met een concatenate load moet werken doordat
//per keer de for lus doorloopen wordt een anders veld wordt gemaakt, $(S). En je kan enkel een concatenate load doen op een reeds
//bestaande tabel
OnderzoekStatussen_temp:
LET S = peek('Status',0,'Statussen');
LOAD SLEUTEL,
IF(SLEUTEL = peek(SLEUTEL),peek(Counter)+1,1) AS Counter,
LS_INSERTDATE as $(S),
LS_STATUS
RESIDENT StatussenTijd
WHERE LS_STATUS = '$(S)';

FOR rowStatus = 1 TO $(nrSTATUSSEN)
LET S = peek('Status',rowStatus,'Statussen');
Concatenate LOAD SLEUTEL,
IF(SLEUTEL = peek(SLEUTEL),peek(Counter)+1,1) AS Counter,
LS_INSERTDATE as $(S),
LS_STATUS
RESIDENT StatussenTijd
WHERE LS_STATUS = '$(S)';
NEXT

//Een tabel met alle waarden voor Counter
Counters:
Load distinct Counter as Teller
resident OnderzoekStatussen_temp
where isnull(Counter) = 0;

//Tel het aantal Counters
LET nrCOUNTERS = noofrows('Counters')-1;

//Resident load van de OnderzoekStatussen_temp om de Status samen te voegen met zijn Counter,
//zo krijg je VL1, VL2, VL3, IL,1, IL2, ...
FOR rowStatus = 0 TO $(nrSTATUSSEN)
FOR rowCounter = 0 TO $(nrCOUNTERS)
LET S = peek('Status',rowStatus,'Statussen');
LET C = peek('Teller',rowCounter,'Counters');
left join (OnderzoekStatussen)
load
SLEUTEL,
$(S) as $(S)$(C)
resident OnderzoekStatussen_temp
WHERE LS_STATUS = '$(S)' and Counter = $(C);
Next
Next

DROP TABLES
Radiologie
,OnderzoekStatussen_temp
,StatussenTijd
,Counters
,Statussen
;