Skip to main content
Announcements
NEW: Seamless Public Data Sharing with Qlik's New Anonymous Access Capability: TELL ME MORE!
cancel
Showing results for 
Search instead for 
Did you mean: 
robert_gansel
Contributor III
Contributor III

Rechnen mit NULL-Werten

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.

5 Replies
swuehl
MVP
MVP

Vielleicht so:

count({<MieterEinzug={"<=$(=dHeute)"}, MieterAuszug -= {"<$(=dHeute)"}, Mietername={'Leerstand'}>} Mietername)

Beachte das Minuszeichen vor dem Gleichheitszeichen, um die Datumswerte in der Vergangenheit auszuschliessen.

robert_gansel
Contributor III
Contributor III
Author

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?

swuehl
MVP
MVP

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)

Not applicable

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;

 

 

swuehl
MVP
MVP

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;