Skip to content

Reading an Answer

The SQL, the rows and the chart — and how to tell a good answer from a confident one.

Every answer ships with its own evidence. Reading that evidence takes about ten seconds and is the difference between a number you can present and a number you are hoping is right.

The prose. One or two sentences answering the question you asked.

The queries. Every SQL statement it ran, in order, expandable. A question often takes more than one: look at the schema, sample a table, then answer.

The rows. The actual result set of the final query, as a table, with real column names. Not a summary — the rows themselves.

A chart, where the shape of the data supports one. Drawn from those rows.

Follow-up prompts — the next questions this answer raises.

  1. Read the WHERE clause. This catches the most common problem by far: a time window or a campaign filter that is not the one you meant.
  2. Check the row count against the prose. “Three keywords fell” should sit above three rows. A mismatch is the clearest possible signal.
  3. Look at what it grouped by. An average across campaigns and an average within one campaign are different numbers with the same name.

Usually the question was ambiguous rather than the data being bad. In order of likelihood:

What you seeUsual cause
Numbers lower than expectedThe window excluded runs you had in mind
Numbers higher than expectedSeveral campaigns were included, not one
“No results”Nothing was tracked for that keyword, or in that window
A column you did not expectYour phrasing matched a different table

Ask the follow-up rather than rewriting from scratch — “only campaign X” or “since 1 August instead”. The context is kept, so a correction is one line.

If the query genuinely returns nothing, you get told that rather than given an invented summary. An empty result is a real answer: it usually means the data was never collected, not that the number is zero.

Data Chat reads exactly the same catalogue the MCP server exposes to external agents, under the same read-only role and the same row-level security. If you would rather ask from Claude or Cursor than from the app, query_sql reaches the same tables with the same guarantees.