Qlik Community

New to QlikView

Discussion board where members can get started with QlikView.

Announcements
Make your voice heard! Participate in the 2020 Wisdom of Crowds® Survey. BEGIN SURVEY
merry2018
Contributor III

Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Hallo Zusammen,

ich benötige Mal wieder eure Hilfe und zwar Habe ich einen Datensatz pro Person, welche verschiedene Abteilungen durchläuft, diese werden auch mit einem Gültigkeitsdatum festgehalten und jetzt soll in einer Tabelle immer die Abteilung zu dem passenden Datum ermittlen.

Dazu folgendes Beispiel:

DatumPersongearbeiteteZeit
01.02.2019Maria6
02.02.2019Maria5
03.02.2019Maria4
….  
28.02.2019Maria5
01.03.2019Maria4
02.03.2019Maria6
03.03.2019Maria3
....  

 

Und dann gibt es noch folgendes Verzeichniss, wo ersichtlich ist wann es geändert wurde

Gültig abWenAbteilung
01.03.2019MariaVerkauf
01.01.2019MariaEinkauf

 

Jetzt möchte ich zu jedem Datum die passende Abteilung in einem Diagramm ermitteln, indem ich prüfe welches Gültig ab ist das nächst kleinere für das jeweilige Datum.

 

Wer hat hier eine Idee ? 

 

Vielen Dank im Voraus
Merry

Labels (4)
1 Solution

Accepted Solutions
Highlighted
MVP & Luminary
MVP & Luminary

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Ist im Prinzip dasselbe wie hier: Ermitteln-der-einzelnen-Datums-zwischen-zwei-Datums und falls es kein bis/von Datum gibt, muss man es halt mit Interrekord-Funktionen, wie Peek-or-Previous generieren, in etwa so:

load Person, von, if(previous(Person)<>Person, today(), date(previous(von)-1)) as bis
resident Quelle order by Person, von desc;

Abhängig von den Daten und Anforderungen braucht es vielleicht noch ein/zwei mehr Bedingungen, um alle Eventualitäten abzufangen. Probiere es (Schritt für Schritt in einem Dummy) einfach mal aus.

Schöne Grüße
Marcus

View solution in original post

6 Replies
Highlighted
MVP & Luminary
MVP & Luminary

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Ist im Prinzip dasselbe wie hier: Ermitteln-der-einzelnen-Datums-zwischen-zwei-Datums und falls es kein bis/von Datum gibt, muss man es halt mit Interrekord-Funktionen, wie Peek-or-Previous generieren, in etwa so:

load Person, von, if(previous(Person)<>Person, today(), date(previous(von)-1)) as bis
resident Quelle order by Person, von desc;

Abhängig von den Daten und Anforderungen braucht es vielleicht noch ein/zwei mehr Bedingungen, um alle Eventualitäten abzufangen. Probiere es (Schritt für Schritt in einem Dummy) einfach mal aus.

Schöne Grüße
Marcus

View solution in original post

Highlighted
merry2018
Contributor III

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Danke für die Antwort.

Ok ja dann muss ich mal schauen wie ich es löse, ich hatte gehofft es gibt hier eine andere Möglichkeit wie z. b. mit einem der folgenden Varianten

if( gueltig_ab < Datum, only({<gueltig_ab={max(gueltig_ab)}>}Arbeit)
oder statt Only folgend
if( gueltig_ab < Datum, FirstSortetValue(Arbeit,gueltig_ab))
oder ganz ohne if
FirstSortetValue({<gueltig_ab={"<=(Datum)"}>}Arbeit,gueltig_ab)

es zu lösen, aber leider klappt das nicht so ganz wie gewünscht. Oder muss ich die Formel nur etwas anpassen, damit es so auch läuft?

 

 

Highlighted
MVP & Luminary
MVP & Luminary

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Ich möchte nicht sagen, dass es nicht möglich wäre, es auch in der Oberfläche zu berechnen, denke aber, es würde deutlich komplexer, als es einfach im Skript zu machen.

Es gibt halt mehrere gültig_ab und sicher auch multiple Datumswerte jeweils pro Person, gegen die das ermittelt werden müsste. Das meint, man müsste erstmal mit (verschachtelten) aggr-Funktionen eine entsprechende (virtuelle) Tabelle generiert werden, auf die man dann die Bedingungen anwenden könnte. Vermutlich möglich, aber IMO absolut nicht empfehlenswert.

- Marcus

Highlighted
merry2018
Contributor III

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Danke für deine Hilfe - es hat mal wieder geklappt womit ich die Daten jetzt so habe wie ich sie brauche.
 
Umgesetzt habe ich es mit deinem Tipp, zuerst das Gueltig_bis in einer Tabelle ermitteln und dann in dem ich das selben vorgehen wie das letzte mal(also über den Link wo erwähnt wurde) gemacht habe nur etwas verkürzt also ohne das mapping da ich die eigentliche mappingTabelle als endTabelle genommen habe, da dort schon raus kam was ich wollte.


Grüße
Merry

Highlighted
merry2018
Contributor III

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

ok jetzt wäre nur noch die Frage wie ich es im Diagramm zum Anzeigen bekomme und zwar habe ich mir es folgend vorgestellt:

Only({<Final.Monat ={"=$(=MonthStart(Datum))"}>}Final.Arbeit)

 

Und verbunden ist diese Tabelle schon über den Mitarbeiter, jetzt soll es nur noch bei ausgewähltem Datum die passende Arbeit zu dem jeweiligen Monat anzeigen. Zur Info es muss immer ein einzelner Monat ausgewählt sein.

 

Was habe ich falsch gemacht an meiner Formel oder muss ich anders machen?  

Highlighted
MVP & Luminary
MVP & Luminary

Re: Ermitteln eines Datensatzes, welcher das maximale aber kleinere Datum wie angegeben hat

Ohne nähere Kenntnis vom Datenmodell ist es schwierig zu sagen, warum das so jetzt nicht geht, aber es gibt hier schon ein paar Auffälligkeiten, z.B. wird hier ein Monatsfeld (jedenfalls dem Namen nach) mit einem Zeitstempel verglichen. Hier könnte jetzt sowohl der numerische Wert unterschiedlich sein, als auch das Format. Hinzu kommt, dass der Bedingungswert eine (adhoc) Variable ist, die global berechnet wird und nicht etwa auf der dimensionalen Ebene. Darüber hinaus wird only() verwendet, dass bei mehreren verfügbaren Werten NULL zurückgibt.

Insofern sollte eher etwas wie das hier ein valides (Zwischen-)Ergebnis liefern:

concat({<Final.Arbeit ={"=num(Final.Monat)=num(month(Datum))"}>}Final.Arbeit, ' + ')


Der Monatsvergleich innerhalb der Set Analysis ist jetzt eine Art von implizierter If-Schleife und erfolgt auf Datensatzebene, es werden definitiv nur die numerischen Werte verglichen (theoretisch kann man darauf innerhalb einer If verzichten, macht die Logik hier aber etwas klarer) und falls es mehrere Werte geben sollte, gibt concat() diese auch aus - man sieht diese somit und könnte sich dann überlegen, ob man sie durch min/max/avg/sum ersetzen kann oder ob das grundsetzlich anders aufgebaut werden müsste.

Ein weiterer Punkt ist die Aussage, dass diese Daten über den Mitarbeiter mit einander verknüpft sind - das muss nicht unbedingt ausreichend sein, sondern möglicherweise müsste auch über das Datum verknüpft werden, mit einem zusammengesetzten Schlüssel oder vielleicht einer gänzlich anderen Zuordnung/Matching der Tabellen untereinander.

Schöne Grüße
Marcus