Filter Trees
The report that needs two exceptions and a date range stays one widget. Conditions sit inside conditions and compile into a single where clause, so you are not left running three tiles that nearly agree with each other.
One widget, one where clause
depth 2 · 2 of 6 conditions- ANDlevel 1
- deals.stageinProposal, Negotiation
- ORlevel 2
- accounts.tierequalsEnterprise
- ANDlevel 3
- accounts.employee_countat or above250
- contacts.countrydoes not containUS
- deals.amountbetween25,000 and 250,000
- deals.owner_idequals
TRUEdeals.stage IN ($1, $2)accounts.tier = $3accounts.employee_count >= $4contacts.country NOT ILIKE '%' || $5 || '%'deals.amount BETWEEN $6 AND $7TRUE
- boolean4
- identifier6
- date9
- text10
- numeric11
Product figures from the platform’s own defaults - not customer averages
How it works.
Leaves and groups, all the way down
A leaf names a module, a field, an operator and a value. A group names a conjunction and holds children, each of which is a leaf or another group. An empty group compiles to true rather than to an error, so a half-built tree never breaks the widget above it.
Every operator on the list actually runs
Six comparisons, membership and its negation, four string forms, a range, the two emptiness checks and the two boolean checks. String matching ignores case, and a negated contains compiles to a negated case-insensitive match rather than an exclusion list.
The column narrows what you are offered
Boolean columns show four operators, numeric eleven, date nine, identifier columns six, and text ten. Pick a different column and the operator resets when the one you had is not on the new list.
Blank is treated as unasked
A comparison with nothing in it compiles to true, a membership test with an empty list compiles to false, and a range with one end filled compiles to that end alone. Empty strings are never bound against typed columns, which is where this used to fall over.
Two moments in every number.
Every number passes through the same seven. Filter Trees is the lit ones, and everything either side of it is a different page in this category.
- 01Query
what is asked, and of what
- 02Shape
the measure and the dimension
- 03Draw
the visual chosen for that shape
- 04Arrange
where it sits on a dashboard
- 05Filter
narrowing it after the fact
- 06Drill
going from the number to the rows
- 07Share
who else gets to see it
The specifics.
8 facts- Operators
- Equals, not equals, in, not in, contains, does not contain, starts with, ends with, four comparisons, between, is null, is not null, is true, is false
- Depth
- Eight levels, checked when authored and again when queried
- Size
- Two hundred conditions, over which the request is refused with a message naming the cap
- Text matching
- Case-insensitive both ways
- Blank leaves
- Neutralized rather than rejected
- Modules
- A condition may only name a table the widget already lists, otherwise the query is refused
- Runs
- In the where clause, before any aggregate
- Not the same as
- Cross-Filtering, where a click adds a temporary condition on top of this one for as long as it is selected
What this is assembled from.
A number on a dashboard was built somewhere before it was drawn. These are the parts it is made of.
More in Reporting & Analytics
12 capabilitiesSeven data shapes, twenty-two visuals, shareable without a login.
Hand a board to a team or a CRM role, at read or at edit, by the person who built it. Roles outlive people, which is why a share points at one, not a mailbox.
Nobody builds a chart that misreads its own numbers, or finds that out on the wallboard. Columns, funnels, treemaps, radar, scatter, gauges and pivots.
The board a team opens on holds the figures that team is judged by, not everybody's. Six columns to lay them out in, and your own tab opens first.
Some answers will not fit on the board that raised the question. A click leaves carrying the value it stood on, and lands on a board already narrowed to it.
Agents down the side, weeks across the top, and the number you care about in every cell. The shape finance asks for when a chart will not settle the argument.
A board on the wall gets read from across the room. Anything under target colors itself as the chart is painted, so a supervisor sees it without stopping.
The number that was promised, drawn across the same chart as the number that arrived, so the floor reads itself against its target, not yesterday's bars.
Nobody has to remember what last week looked like, or dig out the sheet it was written on. The same figure is counted again over the window before it.
Six palettes, one a print set for the pack that goes in front of a client. Pin one to a tile and the series, axis, grid and tooltip all move together.
Send a client the board without giving them a login. The address works until the day you name, dies the moment you revoke it, and leaves a row explaining why.
A figure on the screen where the work happens, not on a board somebody must remember to open. Built once, worked out against the records of whoever opens it.
How many calls, how many answered, how long they ran, how many missed, counted off the records the switch already wrote. Not a sample or last night's export.
The rest of the platform.
Five more categories, all on the same record and the same bill. Each card names three of its capabilities, so you can tell from here whether it is worth opening.
Reporting & Analytics
See filter trees on your own floor.
Thirty minutes, your numbers and your data. We will set filter trees up live and you can decide from the thing itself rather than from this page.
14-day trial · no card · migration included