Data Quality and Integrity: Cleansing, Null Handling, Granularity, Key Consistency
Nulls are not zeros and not blanks
Nulls propagate: 1 + Null is Null. Aggregations ignore them (Sum, Avg, Count(field)), but Count(*) counts rows regardless. IsNull, NullCount, Alt() (first non-null argument) and Coalesce() are everyday tools; NullAsValue and NullAsNull control how the following load treats nulls - a common trap is placing NullAsValue in the wrong position so it silently affects nothing.
Keys are where quality problems become modeling problems. A key held as text on one side and as a number on the other will not associate. Clean keys at load time on both sides: Trim(), Upper(), PurgeChar(), KeepChar(), SubField() for compound keys, and Num#()/Date#() with an explicit format. Remember Qlik stores dual values, so '00123' and 123 can look identical in a list box yet behave differently in a join.
Granularity is the other silent killer. If one table holds a row per order line and another a row per order, summing across both double counts. Confirm what a row means before modeling, and validate with Count(*) versus Count(DISTINCT Key).
Rule of thumb: normalise every key identically on both sides of an association (Upper(Trim(Key))) and assert consistency by comparing distinct key counts in each table.
Worked example: Num#(CustomerID,'0000') converts a zero-padded string to a number so it matches the numeric key in the customer table; without it the association is empty and every customer measure shows as unlinked.