Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hallo QlikCommunity,
ich habe ein Problem mit ein paar NULL-Werten in meiner Datenbank.
In meiner Tabelle stehen Mietverträge und ich will alle Verträge mit dem Mieternamen "Leerstand" herausfiltern. Kein Problem.
Damit ich aber nur aktuelle Leerstände bekomme, müssen 2 Bedingungen erfüllt sein:
1. Der Einzug des Mieters Leerstand muss vor dem heutigen Tag liegen
2. Der Auszug muss in der Zukunft liegen.
Dafür habe ich folgende Abfrage:
count({<MieterEinzug={"<=$(=dHeute)"}, MieterAuszug={">=$(=dHeute)"}, Mietername={'Leerstand'}>} Mietername)
Diese funktioniert soweit, jedoch hat sie einen Haken:
Es kann sein, dass im Feld Auszug noch gar kein Termin bekannt ist, da keine Neuvermietung stattgefunden hat. In diesem Fall steht in der DB im Feld Auszug dann "NULL". Kann Qlikview dann überhaupt mit diesen NULL-Wert rechnen?
Ich habe dann weiter versucht über die Funktion isNull() ein entweder oder zu prüfen:
count({<MieterEinzug={"<=$(=dHeute)"}, MieterAuszug={">=$(=dHeute)"} or IsNull(MieterAuszug)=-1, Mietername={'Leerstand'}>} Mietername)
Funktioniert leider auch nicht.
Im Ergebnis müssten folgende Bedingungen zutreffen:
1. Name = 'Leerstand'
2. Einzugsdatum muss vor Heute liegen
3. Auszugsdatum muss entweder in der Zukunft liegen oder 'NULL' sein
Hat jemand eine Idee was ich falsch gemacht habe? Besten Dank im Voraus für alle hilfreichen Vorschläge.
Vielleicht so:
count({<MieterEinzug={"<=$(=dHeute)"}, MieterAuszug -= {"<$(=dHeute)"}, Mietername={'Leerstand'}>} Mietername)
Beachte das Minuszeichen vor dem Gleichheitszeichen, um die Datumswerte in der Vergangenheit auszuschliessen.
Danke für die schnelle Antwort. Haut aber noch nicht ganz hin. Die Spaltenbezeichnungen danach, z.B. Mietername werden jetzt auch nicht mehr als solche erkannt, glaube ich.
Kann denn Qlikview eine Berechnung "17.01.2014 > NULL" ausführen und ein sinnvolles Ergebnis liefern?
Das rote Unterkringeln im Formel-Editor ist leider ein Bug im Editor, der den Operator -= nicht richtig erkennt. Die Formel ist syntaktisch korrekt.
Sie funktioniert aber tatsächlich nur, wenn MieterAuszug einen Wert, z.B. ein Leerzeichen oder kein Zeichen enthält, nicht für NULL.
Es ist in QV immer ein wenig komplizierter, wenn man NULL Werte in Set Analysis verarbeiten will, da man NULL Werte nicht selektieren kann, und Set Analysis nun einmal prinzipiell wie Selektionen arbeitet.
Am einfachsten ersetzt man beim Laden im Skript die Nullwerte durch z.b, einen Text ( mit if() Abfrage und isnull(FELD) oder len(trim(FELD))=0, oder man erzeugt sich gleich ein Flag für die Zeilen, die man filtern will (also aktuelle Leerstände:
LOAD RowNo() as ID,
*,
if(Mietername = 'Leerstand' and MieterEinzug <= today() and (MieterAuszug >= today() or len(trim(MieterAuszug))=0), 1,0) as AktuellLeer
INLINE [
Mietername, MieterEinzug, MieterAuszug
Leerstand, 01.01.2014,
Leerstand, 01.01.2014, 02.01.2014
Leerstand, 01.01.2014, 01.02.2014
Leerstand, 01.02.2014, 02.02.2014
KeinLeerstand, 01.01.2014, 02.02.2014
]
;
Man kann auch versuchen, mit Set Analysis zu arbeiten, dann könnte die Abfrage vielleicht so aussehen:
=count(
{<MieterEinzug={"<=$(=dHeute)"}, Mietername={'Leerstand'}>
- <MieterEinzug={"<=$(=dHeute)"}, Mietername={'Leerstand'}, MieterAuszug = {"<$(=dHeute)"}> }
Mietername)
hallo swuehl. bin ganz neu hier, aber das Thema beschäftigt mich schon. hier ist ein Script, kannst du bitte rein schauen und mir sagen – wie kann ich in dem Fall leeren Wert durch eine Konstante ersetzen, wenn weder IsNull() noch Len(Trim()) auf diesen fehlenden Wert reagieren? Danke
---------
testtab1:
LOAD *
INLINE
[
S1, S2
1, AA
2, BB
3, CC
]
;
testtab2:
LOAD *
INLINE
[
S1, S3
1, XX
3, ZZ
]
;
testtab3:
NoConcatenate
LOAD
S1,
S2
RESIDENT testtab1;
LEFT JOIN
LOAD
S1,
S3,
IsNull(S3) as S3_Is_Null,
Len(Trim(S3)) as S3_len_trim,
If(IsNull(S3) or Len(Trim(S3))=0, 'leer', S3) as S3_conv
RESIDENT testtab2;
drop tables testtab1, testtab2;
exit script;
Das ist eigentlich nicht kompliziert, in dem Augenblick, wenn deine letzte Tabelle geladen wird, sind die hereinkommende Feldwerte für S3 ja noch alle gesetzt, erst nach dem JOIN gibt es Datensätze mit NULL.
Du musst da also nach dem JOIN ansetzen:
testtab1:
LOAD *
INLINE
[
S1, S2
1, AA
2, BB
3, CC
]
;
testtab2:
LOAD *
INLINE
[
S1, S3
1, XX
3, ZZ
]
;
testtab3:
NoConcatenate
LOAD
S1,
S2
RESIDENT testtab1;
LEFT JOIN
LOAD
S1,
S3
RESIDENT testtab2;
RESULT:
LOAD *,
IsNull(S3) as S3_Is_Null,
Len(Trim(S3)) as S3_len_trim,
If(IsNull(S3) or Len(Trim(S3))=0, 'leer', S3) as S3_conv
Resident testtab3;
drop tables testtab1, testtab2, testtab3;