Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Fehlende Datensätze und Werte automatisch generieren

Hallo,

da mir leider noch einige "richtige" Begriffe fehlen - finde ich bisher die Lösung für mein Problem nicht und wende mich daher an die Community - vielleicht kann mich jemand unterstützen?

Iststand
Vorhanden ist eine Tabelle (Excel) mit u.a. folgenden 5 Feldern (Spalten):

ID     -     Startdatum      -     Enddatum      -     Messwertdatum     -     Messwertergebnis (String/Text)

Die ID ist eindeutig - Startdatum und Enddatum jeweils ebenfalls dazugehörend ....

Bedingt durch die Möglichkeit mehrerer Messwertdaten und -ergebnisse kommen die Datensätze entsprechend zum Teil häufiger vor.

Optimum = Soll/Wunsch

Für JEDEN Tag - angefangen vom Startdatum bis einschliesslich Enddatum - liegt ein Datensatz vor ... (Beispiel IST)

An den Tagen, wo ein reales Messwertergebnis vorliegt, soll dieses eingetragen sein,

bei allen Werten die fehlen, jeweils das Ergebnis fortgeschrieben werden, was am direkt vorhergehenden realen Messwertdatum hängt, ist das erste Messwertdatum später, als das Startdatum, dann soll dieses auch seit Start gelten .... (SOLL/Wunsch - rote Zeilen)

Beispiel   IST

ID       Startdatum     Enddatum      Messwertdatum   Messwertergebnis

111     05.01.2012     10.01.2012     06.01.2012          abc

111     05.01.2012     10.01.2012     07.01.2012          abf

111     05.01.2012     10.01.2012     09.01.2012          abc

SOLL/Wunsch

ID       Startdatum     Enddatum      Messwertdatum   Messwertergebnis

111     05.01.2012     10.01.2012     05.01.2012          abc

111     05.01.2012     10.01.2012     06.01.2012          abc

111     05.01.2012     10.01.2012     07.01.2012          abf

111     05.01.2012     10.01.2012     08.01.2012          abf

111     05.01.2012     10.01.2012     09.01.2012          abc

111     05.01.2012     10.01.2012     10.01.2012          abc

Die Erklärungen für Loop/while o.ä. habe ich versucht nachzuvollziehen - und bin gescheitert.

Vielleicht gibt es irgendwo ein direktes Beispiel, was ich verstehen kann oder jemand kennt die notwendigen Zeilen für das Skript !??!

Das wäre prima.

Bis bald!

Michaela

1 Solution

Accepted Solutions
swuehl
MVP
MVP

Michaela,

du bist hier im Forum mit deiner Frage genau richtig. Nur ein kleiner Tip: In den Communities wie 'New to QlikView' wird bevorzugt Englisch gesprochen, macht aber auch nichts, mal auf deutsch zu posten. Es gibt allerdings auch eine deutschsprachige Gruppe:

http://community.qlik.com/groups/german-user-group

So, nun zu deiner Frage, ich denke du kannst das Problem lösen, indem du in drei Schritten vorgehst:

1) Erzeuge die fehlenden Records, die einzelnen IDs mit Startdatum und Enddatum lädst und dann in einer while Schleife alle Messwertdatum Redcords für die ID-Periode erzeugst und mit deiner IST Tabelle joinst

2)+3) Dann lädst du die Tabelle nochmal sortiert nach ID und Messwertdatum (einmal aufsteigend, einmal absteigend) und füllst die fehlenden Messwerte mit den vorangehenden Messwerten auf.

Also so:

IST:

LOAD * INLINE [

ID,       Startdatum,     Enddatum,      Messwertdatum,   Messwertergebnis

111,     05.01.2012,     10.01.2012,     06.01.2012,          abc

111,     05.01.2012,     10.01.2012,     07.01.2012,          abf

111,     05.01.2012,     10.01.2012,     09.01.2012,          abc

222,     11.01.2012,     14.01.2012,     12.01.2012,          efg

222,     11.01.2012,     14.01.2012,     13.01.2012,          hij

];

// Create all needed Messwertdatum records per ID

TMP:

LOAD distinct

ID,

Startdatum,

Enddatum

resident IST;

join (IST) LOAD *,

Date(Startdatum+iterno()-1) as Messwertdatum

resident TMP while Startdatum+iterno()-1 <= Enddatum;

drop table TMP;

// Fill missing records, based on previous date

SOLL1:

Noconcatenate LOAD ID, Startdatum, Enddatum, Messwertdatum,

if(peek(ID) = ID and isnull(Messwertergebnis), peek(Messwertergebnis), Messwertergebnis) as Messwertergebnis

resident IST order by ID, Messwertdatum asc;

drop table IST;

// Fill missing records, based on next date (needed if first Messwertdatum records are not filled)

SOLL:

Noconcatenate LOAD ID, Startdatum, Enddatum, Messwertdatum,

if(peek(ID) = ID and isnull(Messwertergebnis), peek(Messwertergebnis), Messwertergebnis) as Messwertergebnis

resident SOLL1 order by ID, Messwertdatum desc;

drop table SOLL1;

Gruß,

Stefan

View solution in original post

6 Replies
swuehl
MVP
MVP

Michaela,

du bist hier im Forum mit deiner Frage genau richtig. Nur ein kleiner Tip: In den Communities wie 'New to QlikView' wird bevorzugt Englisch gesprochen, macht aber auch nichts, mal auf deutsch zu posten. Es gibt allerdings auch eine deutschsprachige Gruppe:

http://community.qlik.com/groups/german-user-group

So, nun zu deiner Frage, ich denke du kannst das Problem lösen, indem du in drei Schritten vorgehst:

1) Erzeuge die fehlenden Records, die einzelnen IDs mit Startdatum und Enddatum lädst und dann in einer while Schleife alle Messwertdatum Redcords für die ID-Periode erzeugst und mit deiner IST Tabelle joinst

2)+3) Dann lädst du die Tabelle nochmal sortiert nach ID und Messwertdatum (einmal aufsteigend, einmal absteigend) und füllst die fehlenden Messwerte mit den vorangehenden Messwerten auf.

Also so:

IST:

LOAD * INLINE [

ID,       Startdatum,     Enddatum,      Messwertdatum,   Messwertergebnis

111,     05.01.2012,     10.01.2012,     06.01.2012,          abc

111,     05.01.2012,     10.01.2012,     07.01.2012,          abf

111,     05.01.2012,     10.01.2012,     09.01.2012,          abc

222,     11.01.2012,     14.01.2012,     12.01.2012,          efg

222,     11.01.2012,     14.01.2012,     13.01.2012,          hij

];

// Create all needed Messwertdatum records per ID

TMP:

LOAD distinct

ID,

Startdatum,

Enddatum

resident IST;

join (IST) LOAD *,

Date(Startdatum+iterno()-1) as Messwertdatum

resident TMP while Startdatum+iterno()-1 <= Enddatum;

drop table TMP;

// Fill missing records, based on previous date

SOLL1:

Noconcatenate LOAD ID, Startdatum, Enddatum, Messwertdatum,

if(peek(ID) = ID and isnull(Messwertergebnis), peek(Messwertergebnis), Messwertergebnis) as Messwertergebnis

resident IST order by ID, Messwertdatum asc;

drop table IST;

// Fill missing records, based on next date (needed if first Messwertdatum records are not filled)

SOLL:

Noconcatenate LOAD ID, Startdatum, Enddatum, Messwertdatum,

if(peek(ID) = ID and isnull(Messwertergebnis), peek(Messwertergebnis), Messwertergebnis) as Messwertergebnis

resident SOLL1 order by ID, Messwertdatum desc;

drop table SOLL1;

Gruß,

Stefan

Not applicable
Author

DANKE !

Bin ganz begeistert – es funktioniert einfach!

Und sorry - meinen Englischkenntnissen hatte ich an dieser Stelle nicht getraut, da ich noch nicht einmal die deutschen Begriffe „sauber“ kenne …

Ich werde mich bessern! ☺

LG Michaela

Von: swuehl

Gesendet: Sonntag, 11. März 2012 12:46

An: Feldhordt, Michaela

Betreff: - Re: Fehlende Datensätze und Werte automatisch generieren

QlikCommunity<http://community.qlik.com/index.jspa>

Re: Fehlende Datensätze und Werte automatisch generieren

erstellt von swuehl<http://community.qlik.com/people/swuehl> in New to QlikView - vollen Thread anzeigen<http://community.qlik.com/message/199773#199773

swuehl
MVP
MVP

Gern geschehen.

Wollte auch nur sagen, dass die communities international sind und die inoffizielle Sprache hier englisch ist. Du findest halt schneller Hilfe, je mehr Personen deine Frage auch verstehen können. Natürlich hilft es auch, die "richtigen" Begriffe zu verwenden, aber ich finde, deine Anfrage war da schon sehr gut verständlich.

Wenn du mit einer Antwort hier im Forum zufrieden bist, kannst du auch diese Antwort als 'hilfreich' oder 'richtige Antwort' kennzeichnen, das hilft dann später anderen, schneller einen Überblick über die Diskussion zu gewinnen.

Gruß,

Stefan

Not applicable
Author

Hi Stephan,

thank you for your submission of a solution for Michaela's problem.

I currently have a similar problem: I prepared a document with the price development of materials and the table looks like this:

IST:

LOAD * INLINE [

Material,       PriceChanceDate,    Price

Bananas,     05.01.2012,     99
Bananas,     05.05.2012,     110
Bananas,     05.09.2012,    104

Apples,     05.01.2012,    22

Oranges,     05.01.2012,    78

Peaches,     11.01.2012,    89

Strawberries,     11.01.2012,     66
Bananas,     05.10.2012,     96
Apples,     05.02.2012,    25

Apples,     05.03.2012,    22

];

What I need is a table that shows the actual price for a Material on a certain date until today.

Can you or anyone help me? I guess it's a basic problem but I would appreciate any help with this.

Thank you, regards,

Sebastian

swuehl
MVP
MVP

This is indeed a quite common problem, and you should find some possible approaches here in the community when searching for price book or exchange rate. One approach involves using intervalmatch load prefix in its extended syntax.

Please check these links for some samples:

http://community.qlik.com/message/218622

http://community.qlik.com/message/73878

http://community.qlik.com/message/238735

Not applicable
Author

Hi Stephan,

thanks for the links! This is what I tried:

http://community.qlik.com/thread/10641

Best regards,

Sebastian