Structuring your data

What good structure looks like, and the quiet mistakes that turn a right-looking answer into a wrong one.

sales.xlsx
ABCDEFGH
1
order_id
customer_name
city
order_date
amount
status
region
2
1001
Alice Johnson
London
2026-03-15
249.00
shipped
West
3
1002
Bob Chen
New York
2026-03-16
89.50
delivered
East
4
1003
Carol Smith
Berlin
2026-03-17
412.00
processing
West
5
1004
David Park
Tokyo
2026-03-18
67.25
shipped
East
6
1005
Emma Wilson
Sydney
2026-03-19
183.00
delivered
West
7
1006
Frank Hall
London
2026-03-20
55.75
shipped
West
8
1007
Grace Lee
Paris
2026-03-21
310.00
processing
East
9
1008
Henry Kim
New York
2026-03-22
142.50
delivered
East
10
11
12
ordersreturnstotals
sales FINAL v3 (2).xlsx
ABCDEFGH
1
Sales Q1 (FINAL v3, do not edit!!)
2
3
Name / City
Date
Rev £
Paid?
Totals
4
John Smith / London
15 March
£1,200
Y
region
sum
5
Jane Doe / NYC
2026-03-16
–
West
1,538.50
6
Acme Corp
last Tuesday
0
N/A
East
89.50
7
Bob Chen (new!)
16/3
89.5
Y
8
TOTAL
£1,289.50
9
10
Returns
11
order
why
£
12
1001
damaged
249.00
Sheet1

What structured data is

Structured data is information laid out in rows and columns, where every value has a type and a meaning. It lives in tables, spreadsheets and databases, as opposed to emails, documents and notes.

These two files hold much the same information. Ask them both a question and see which one can answer.

Ask both files:
notes.xlsx
Waiting for a question.
ABCD
1
Meeting notes: timeline discussed. Next: 1) finalise budget 2) send update
2
John Smith, jsmith@northwind.co.uk. Interested in the proposal, call back
3
Sarah Lee joined marketing in March, great so far
4
Customer feedback: service was fine but delivery was late
5
Mike C moved to IT last Nov, Emily starts Feb
6
Call the client 12/5 at 10am, follow up on pricing
Sheet1

Free text in a column. Nothing here is a column, so nothing can be sorted, filtered or counted.

people.xlsx
Waiting for a question.
ABCD
1
id
name
department
joined
2
101
John Smith
Sales
2026-01-15
3
102
Sarah Lee
Marketing
2026-03-22
4
103
Mike Chen
IT
2025-11-10
5
104
Emily Davis
People
2026-02-05
6
105
Robert Kim
Finance
2026-07-18
people

One person per row, one attribute per column. Every question has an answer.

Rows and columns

A column is one attribute: a name, a date, an amount. A row is one thing: a customer, an order, a payment. Hold to that and anything can read the table, from a spreadsheet formula to Mira.

orders.xlsx
order_id
customer_name
order_date
amount
status
1001
Alice Johnson
2026-03-15
249.00
shipped
1002
Bob Chen
2026-03-16
89.50
delivered
1003
Carol Smith
2026-03-17
412.00
processing
1004
David Park
2026-03-18
67.25
shipped
orders

Point at a column letter, or a row number.

What makes it good

Rows and columns are not enough on their own. A sheet can look structured and still be unusable if the values inside it do not follow rules. Six of them do most of the work. Each sheet below has one mistake on it. Flip the switch to see it fixed.

  • One fact per cell

    Each cell holds exactly one piece of information. If you need a name and a city, that is two columns.

    ABC
    1
    customer
    amount
    2
    John Smith / London
    1200.00
    3
    Jane Doe / NYC
    640.00
    4
    Acme Corp (Berlin)
    310.00

    A name and a city in one cell. Nothing can group these by city.

  • Consistent types

    Every value in a column is the same kind of thing: all dates, all numbers, or all text.

    AB
    1
    order_date
    amount
    2
    15 March
    249.00
    3
    2026-03-16
    £89.50
    4
    last Tuesday
    412

    Three ways of writing a date. Sorting them puts March after Tuesday.

  • Stable column names

    A column's name is the contract between your data and everything that reads it. It should not change between exports.

    ABC
    1
    Date (Q1)
    Column F
    Rev £ (new)
    2
    2026-03-15
    West
    249.00
    3
    2026-03-16
    East
    89.50
    4
    2026-03-17
    West
    412.00

    A quarter in the name, a name that means nothing, and a name that will change next month.

  • One table per sheet

    Each sheet holds one table, starting at row 1, column A. Two sets of data belong on two sheets.

    ABCD
    1
    id
    amount
    Total
    2
    1001
    249.00
    750.50
    3
    1002
    89.50
    4
    1003
    412.00
    Sheet1

    A total floating beside the data. Anything reading the sheet takes it for a fourth order.

  • No hidden meaning

    Colour, merged cells and notes are invisible to anything reading the sheet. If it matters, it belongs in a column.

    ABCD
    1
    Invoices, March
    2
    invoice
    customer
    amount
    3
    INV-31
    Alice
    249.00
    4
    INV-32
    Bob
    89.50

    Red means overdue and green means paid, but only to a person. The merged title pushes the headers to row 2.

  • Honest gaps

    A missing value is genuinely empty. Zero means they paid nothing. Empty means you do not know. Those are different facts.

    AB
    1
    customer
    revenue
    2
    Alice
    1200.00
    3
    Bob
    –
    4
    Carol
    N/A
    5
    David
    0

    A dash, a word and a zero, all standing in for “we don't know”. The zero goes into every average.

The same data, twice

An export as it arrived from the old system. It looks fine, it will give a wrong answer, and it will not say so. Four fixes turn it into something that can be asked a question.

orders_export.xlsx
ABCD
1
Name / City
Date
Revenue
2
John Smith / London
15 March
£1,200
3
Jane Doe / NYC
2026-03-16
–
4
Acme Corp
last Tuesday
0
5
TOTAL
£1,200
Sheet1

As exported. This is how it left the old system. It looks fine. It will give a wrong answer.

One table per sheet

The most common problem is not bad data inside a table. It is several tables on one sheet: a summary in the corner, a lookup pasted alongside, two unrelated sets stacked with a blank row between them. To a person it looks organised. To anything reading it, it is one table with holes in it.

sales.xlsx
ABCDEF
1
2
3
4
5
6
7
8
9
10
Sheet1
  • Three tables on one sheet, and nothing on the sheet marks where one ends
  • A blank row standing in for a boundary, which nothing can read
  • Two rows of column names, at row 2 and row 8, for two different things

Why it matters

Structure is not housekeeping. It decides what can be asked of the data at all, and whether the answer can be trusted when it comes back. The dangerous mistakes are the ones that never throw an error.

revenue.xlsx
ABC
1
customer
revenue
2
Alice
1200.00
3
Bob
0
4
Carol
800.00
5
David
400.00
6
7
average
600.00
revenue

Bob’s revenue is not known. Record it as

Average 600.00. The zero counts as a sale of nothing and pulls the average down. Nothing flags it.

The average in B7 is =AVERAGE(B2:B5), and it never changed. Only what the cells said did.

What good structure buys you

01

Filter, sort and group with nothing to clean first

When every column holds one kind of thing, a question about a date or a region can be answered straight away.

02

Tables join together reliably

A stable ID column is what ties a customer to their orders, and an order to its returns.

03

Answers come back right

Mira reads what the data says, not what you meant by it. A zero that meant unknown goes into the average as zero.

04

Mistakes show up instead of hiding

Messy data rarely throws an error. It gives a slightly wrong answer that looks perfectly fine.

How tables connect

Your data will not sit in one table. What makes many tables usable is a column they share, so a question can run across them.

customers.xlsx
ABC
1
name
region
customer_id
2
Alice Johnson
West
C-201
3
Bob Chen
East
C-202
4
Carol Smith
West
C-203
5
customers
orders.xlsx
ABC
1
customer_id
order_id
amount
2
C-201
1001
249.00
3
C-202
1002
89.50
4
C-201
1003
412.00
5
C-203
1004
67.25
orders

The customer_id column is in both files. That is the thread from each order to the person who placed it. Point at a row on either side.

Ask across both files:

Before you connect anything

Six checks. They take an afternoon and they head off most of what goes wrong later.

0 of 6

Run your company on its own numbers.

Half an hour is enough to see Mira running on your own tools, with your own data.

Get in touch