Your tennis club has asked its members whether the annual subs should go up. A hundred replies are in and the result is dead level: 50 in favour, 50 against. Stalemate, you think. Then you sort the replies by age and the picture changes completely. Seven in ten members under 30 back the rise, while only three in ten of those aged 60 and over agree.
To create a cross tabulation, pick two questions from your survey, put the answer options of one down the side as rows and the options of the other across the top as columns, then count how many people gave each pair of answers and write that number in the matching cell. At empirio.ai, an online survey tool from Germany, cross tabulations and filters are included from the Plus plan. By the end of this guide you'll know which percentage you can safely report and when a gap between groups is more than a fluke.
📌 The key points at a glance
- With empirio.ai you create cross tabulations for surveys in a few clicks.
- A cross tabulation counts how often two answers occur together.
- Compare groups using row percentages, not percentages of the grand total.
- A chi-squared test shows whether a gap is more than chance.
- empirio.ai filters by date range and exports to Excel or CSV.
Create a survey for free
With empirio.ai you can create a modern online survey in minutes — with hosting in the EU.
- AI-built survey
- Adjust by drag & drop
- Real-time analysis
What is a cross tabulation (contingency table)?
A cross tabulation, also called a crosstab, contingency table or two-way table, is a table that sets two survey questions against each other and shows in every cell how many respondents chose one particular combination of answers.
One question supplies the rows and the other the columns. Each cell is where a row meets a column, for instance every member under 30 who voted for higher subs. Around the edge sit the totals for each row and each column, known as marginal totals. They show the spread of each question taken on its own.
Here is the tennis club vote as a cross tabulation. The figures are invented but typical. The brackets show the share within each age group, so every row adds up to 100 per cent. The results view in empirio.ai puts the share of all responses in brackets instead.
| Age group | In favour of the rise | Against the rise |
|---|---|---|
| Under 30 | 21 (70%) | 9 (30%) |
| 30 to 59 | 20 (50%) | 20 (50%) |
| 60 and over | 9 (30%) | 21 (70%) |
| Total | 50 (50%) | 50 (50%) |
The bottom row is what your ordinary summary already told you: 50 against 50. The row totals come from the age groups: 30 members under 30, 40 aged 30 to 59 and 30 aged 60 and over. Only the rows themselves reveal how differently the age groups voted. If both questions have just two possible answers, you get four cells. Statisticians call this a 2×2 table, and you'll meet it constantly, for example when a yes/no question is split between two groups.
Cross tabulation is the natural next step after counting each question on its own. Our guide on how to evaluate a questionnaire takes you from raw data all the way to conclusions.
When is a cross tabulation worth doing?
A cross tabulation earns its place whenever you want to know whether groups answer differently, be it teams, age bands, customer types or degree courses. Your standard results show the overall picture, and the crosstab shows which groups sit behind it.
Four situations crop up regularly:
- Staff surveys: Splitting job satisfaction by office or shift pattern shows where things are really going wrong. Our guide to running an employee survey covers the groundwork.
- Customer feedback: First-time buyers and loyal regulars often rate the same service in completely different ways, and in a customer survey you only spot that gap once you cross-tabulate.
- Dissertations: A hypothesis such as ‘final-year students feel less confident about finding a job than first-years’ can be tested with a single cross tabulation. Still planning the questionnaire? See our piece on running a survey for your dissertation.
- Clubs and schools: Which date each age group prefers for the summer fête, or how each year group rated the residential trip.
You need two questions with fixed answer categories, so single choice, multiple choice, rating or scale questions. Open text won't work, since every reply is worded differently. With multiple choice, one person can end up in several cells. Row percentages then add up to more than 100 per cent, and the chi-squared test isn't designed for a table like that. Group numbers such as age in years into bands first, or every birthday gets its own row. Which calculations make sense for which kind of answer depends on the levels of measurement.
A crosstab is less useful with very few responses. Spread 20 replies across 15 cells and most cells hold just a handful of people, so one person changing their mind moves the percentages by a wide margin.
How to read a crosstab: row, column and total percentages
You read a cross tabulation correctly when you work out percentages within the groups you want to compare. To find out whether younger members are keener on higher subs, divide each cell by the number of people in that age group.

Every cell can be turned into three different percentages, and each one answers a different question. The 21 members under 30 who voted for the rise work out at 70, 42 or 21 per cent, depending on what you divide by:
| Type of percentage | Sum in the club example | Question it answers |
|---|---|---|
| Row percentage | 21 of 30 members under 30 = 70% | How did this age group vote? |
| Column percentage | 21 of 50 votes in favour = 42% | Who makes up the yes camp? |
| Total percentage | 21 of 100 replies = 21% | How common is this combination overall? |
A simple rule from research methods tells you which one to use: calculate percentages within the categories of the variable you're grouping by. The tidiest way is to put that grouping variable in the rows and work with row percentages. Each row then adds up to 100 per cent and you compare the rows with each other, giving you 70 per cent support among younger members, 50 per cent in the middle and 30 per cent among older members.
Always calculate percentages within the group you want to compare.
Reports often compare percentages that rest on different bases. ‘42 per cent of yes votes came from under-30s’ does not mean that 42 per cent of under-30s voted yes. The first statement describes the yes camp, the second describes the age group. So label every percentage with what it is a percentage of, and give the number of responses.
How to create a cross tabulation in empirio.ai, step by step
In empirio.ai you create a cross tabulation under Results > Analysis > Cross tabulation. You choose one question for the rows and one for the columns, add filters for the date range and incomplete responses if you need them, and export the result as an Excel or CSV file. Cross tabulations and filters come with the Plus plan at €39 a month (prices as of October 2026).
You'll need at least two suitable questions with fixed answers, such as single choice, rating or scale. If your survey doesn't have them, empirio.ai shows the message ‘Cross-tabulation requires at least two suitable questions’ instead of a table. You add the questions in the editor as usual. Haven't sent out your survey yet? You can create a survey for free with empirio.ai.
Step 1: Open the cross tabulation tool
Open your survey and switch to the Results area at the top. In the menu on the left, click Analysis. The analysis tools appear as tiles, and one of them is Cross tabulation. Click that tile to open the view.

Step 2: Choose the questions for rows and columns
At the top of the view are two drop-down menus, Question 1 (rows) and Question 2 (columns). For the rows, pick the variable you want to group by, such as age group. For the columns, pick the question whose answers you want to compare. Any suitable question can be paired with any other, and you can change your choice whenever you like.
Step 3: Filter by date and incomplete responses
Filters decide which responses go into the cross tabulation. With From and To you narrow down the date range, for example to replies that came in after a reminder email. The option Include incomplete responses also counts people who gave up partway through. Leave it switched off and only completed surveys are counted. For most analyses that's the cleaner basis, because everyone in the table has answered right to the end.
Step 4: Read the crosstab and export it to Excel or CSV
Each cell shows the number of responses and, in brackets, its share of the total. The higher the share, the stronger the colour of the cell, so clusters jump out straight away. The Total row at the bottom gives you the column totals. Click Export to download the table, either as an XLSX file with counts and shares or as a CSV file with counts only. If a filter is active, the Excel file notes it, so nobody later mixes up filtered results with the full set.

Because empirio.ai shows each cell's share of the grand total, you work out row percentages yourself from the counts by dividing the cell by its row total.
Row percentages in Excel
Export the crosstab as an XLSX file, then divide every count in Excel by the total of its row. Once you format the results as percentages, each row comes to exactly 100 per cent and you can read the groups side by side.
Create a survey for free
With empirio.ai you can create a modern online survey in minutes — with hosting in the EU.
- AI-built survey
- Adjust by drag & drop
- Real-time analysis
Chi-squared test: is the difference in your crosstab real?
The chi-squared test, often written as chi-square test, checks whether a difference in a cross tabulation is genuine or just down to chance. It compares the frequencies you observed with the ones you would expect if the two questions had nothing to do with each other. If the gap is big enough, you have a statistically significant association.
The underlying question sounds simple. Could all age groups across the whole club actually feel the same, with the pattern only turning up by chance among the people who happened to reply? Your sample size matters a lot here. With 100 replies the question is a fair one, but with 1,000 replies a fluke like that becomes far less likely.
Expected frequencies: how the chi-squared test works
The expected frequency for a cell is its row total multiplied by its column total, divided by the overall total. In the club example, if age made no difference at all, exactly half of each age group would vote in favour: 15 of the 30 younger members, 20 of the 40 in the middle and 15 of the 30 older members. What you actually observed was 21, 20 and 9. Those gaps produce a chi-squared value of 9.6 with two degrees of freedom and a p-value of around 0.008, so below 0.01. If every age group in the whole club truly felt the same, a difference this large would turn up in fewer than one in 100 samples. The association is therefore significant.
A result that isn't significant doesn't prove there's no association, only that your data can't show one. The test starts from the assumption of independence, and a significant result is evidence against exactly that assumption.
When the chi-squared test isn't the right tool
The chi-squared test needs enough responses in each cell. A statistics guide published on the University of Sheffield website says that for tables larger than 2×2 the test can be used if no more than 20 per cent of the expected frequencies are below 5 and none is below 1. The maths and stats guide from the University of Southampton Library takes a stricter line for 2×2 tables and points to Fisher's exact test as soon as an expected count falls below 5. Merging rare answers into larger groups beforehand usually solves the problem.
Cramér's V: how strong is the association?
A significant result tells you nothing about how strong an association is. With very large samples, even tiny differences come out as significant. Cramér's V measures strength on a scale from 0 for no association to 1 for a perfect one. In the club example Cramér's V comes to around 0.31, which common rules of thumb class as a moderate association. For a 2×2 table, meaning two groups and a yes/no answer, you can check statistical significance for free and without signing up, Cramér's V included.
Common cross tabulation mistakes
Most crosstab mistakes aren't in the table itself but in the sentence you write about it in your report. The software gets the sums right, but interpreting them is still your job.
Four mistakes crop up more than any others in reports and dissertations. Three are about reading a single table, and one is about comparing several tables.
Percentages worked out in the wrong direction
The classic slip is comparing column percentages where you meant row percentages. ‘Most yes votes came from younger members’ and ‘most younger members voted yes’ are two different claims, and one can be true while the other is false. Put your grouping variable in the rows, use row percentages and state the base for every figure.
Cells with too few responses
Small cells create big jumps in percentages. With four people in a group, each one is worth 25 per cent, and a single odd answer looks like a trend. Combine small groups or report only the raw numbers for them. The same goes for the test. If cells are too thinly filled, merge groups or switch to Fisher's exact test.
Take care with anonymous surveys
Split the subs vote by membership type and a category with only three life members effectively shows you how each of them voted. Under the UK GDPR, results that let you single out a person may count as personal data, and the ICO's guidance on anonymisation only treats information as anonymous once the risk of identifying someone is sufficiently remote. In an anonymous survey, report only groups of around five responses or more and merge smaller categories before you analyse.
Mixing different filters
Two crosstabs from the same survey only belong side by side if they contain the same responses. Compare a table based on every response with one that leaves out incomplete responses or covers a different date range, and you end up measuring the filter rather than the groups. Keep the filters identical across all tables in a report and write them down.
Mistaking association for cause
A cross tabulation shows that two answers go together, not why. Perhaps older members aren't against higher subs because of their age at all, but because many of them live on a pension and every extra pound hits them harder. You can test a hunch like that by creating the same crosstab separately for each group of a third variable, for example with a PivotTable made from the exported raw data. If the age gap holds among members with and without a pension, age is the likelier explanation, not income.
Checklist: is your crosstab ready for the report?
Run through these points before a cross tabulation goes into a report or presentation. If you can tick every one, your analysis will stand up to awkward questions from the committee or your supervisor.
- The grouping variable sits in the rows.
- Row percentages are calculated and the base is stated.
- Every table gives the number of responses.
- Small groups are merged or reported as raw numbers only.
- All tables you compare use the same filters.
- A difference is only called significant after testing.
- No association is described as a cause.
Conclusion
A cross tabulation shows you which groups sit behind an overall result, and all it takes is two questions and a clear head about percentages. Our advice: put the grouping variable in the rows, use row percentages and run a chi-squared test on any striking difference before you report it. With small groups, when in doubt, merge them rather than read too much into them.
Where to go next
- Working through your whole questionnaire? How to evaluate a questionnaire in five steps
- Not sure which statistic suits your question? Work out the level of measurement
- Need median, mean and significance in context? Descriptive and inferential statistics explained
- Small groups and a survey that must stay anonymous? Create an anonymous survey
Want to compare groups without retyping your data?
With empirio.ai you create cross tabulations right in the results area, filter by date range and export to Excel or CSV, from the Plus plan upwards.
