Yes, you can build a contingency table in Excel in under 60 seconds. But if you’re dragging fields into a PivotTable without checking for hidden blanks or inconsistent text casing, your counts will be silently wrong.
Quick Answer
A contingency table cross-tabulates two categorical variables (like Region and Product Type) to show frequency counts. The fastest reliable method is a PivotTable — but only after cleaning your source data first. For auditability or small datasets, COUNTIFS with structured references beats drag-and-drop every time.
All the Methods
| Method | Time for 10K rows | Accuracy | Difficulty |
|---|---|---|---|
| PivotTable (with clean data) | 12 seconds | ★★★★☆ (fails on leading spaces) | Low |
| COUNTIFS + UNIQUE (dynamic arrays) | 28 seconds (first setup) | ★★★★★ (fully traceable) | Medium |
| Power Query (Group By + Pivot) | 41 seconds (initial load) | ★★★★★ (handles nulls & case automatically) | Medium-High |
| Manual SUMPRODUCT (legacy) | 90+ seconds (per cell) | ★★★☆☆ (error-prone with large ranges) | High |
Method 1 Deep Dive
Let’s say your raw data lives in A1:C1200, with columns: Sales Rep (A), Region (B), and Product Category (C). You want counts of how many deals each rep closed per region.
First: clean it. Select column B, press Ctrl+H, replace " " (space) with nothing. Then use =TRIM(B2) in D2 and drag down — copy/paste values back to B. PivotTables choke on invisible spaces.
Now insert a PivotTable: Alt+N+V → select A1:C1200 → OK. Drag Region to Rows, Sales Rep to Columns, and Sales Rep again to Values (set to Count). Done — but wait. Right-click any count → “Show Values As” → “% of Row Total” gives you proportions instantly.
Here’s what most people miss: If your Region list includes “APAC”, “apac”, and “Apac”, they’ll appear as three separate rows. PivotTables don’t auto-normalize text case. You’ll need =UPPER(B2) before building — or better yet, do that in Power Query.
Method 2 Deep Dive
We’ll build the same table using dynamic arrays — fully formula-driven, no refresh needed, and easy to audit.
Assume your cleaned data is now in F1:H1200: F = Region, G = Sales Rep, H = Deal ID (just a placeholder).
In J1, enter: =UNIQUE(F2:F1200). It spills down — say J1:J5 gets “EMEA”, “NA”, “APAC”, “LATAM”, “JP”. In K1, enter: =TRANSPOSE(UNIQUE(G2:G1200)). It spills right — K1:N1 shows “Sarah Chen”, “Diego Mora”, “Aisha Patel”, “Kenji Tanaka”.
Now in K2, paste this:
=COUNTIFS($F$2:$F$1200,$J2#,$G$2:$G$1200,K$1#)
This single formula spills across K2:N6 — all 20 cells at once. No copy-pasting. Every count links directly to its row/column headers. Change “Sarah Chen” to “Sarah C.” in source? The whole table updates — no PivotTable refresh required.
Pro tip: Add IFERROR(...,0) around COUNTIFS so blank intersections show 0 instead of #N/A. And yes — this works in Excel 365 and Excel 2021 only. If you’re stuck on 2016, skip to Method 3.
Cheat Sheet
| Task | Formula / Shortcut | Notes |
|---|---|---|
| Extract unique regions | =UNIQUE(F2:F1200) |
Spills automatically. Press Enter — no Ctrl+Shift+Enter. |
| Build full contingency grid | =COUNTIFS($F$2:$F$1200,$J2#,$G$2:$G$1200,K$1#) |
Place in top-left cell (K2); fills entire grid. Uses implicit intersection. |
| Insert PivotTable fast | Alt+N+V | Then Tab to select range, Enter. |
| Trim & uppercase in one go | =UPPER(TRIM(B2)) |
Fixes case + whitespace in one step — critical for consistency. |
| Convert to % of row total | Right-click value → Show Values As → % of Row Total | Works only in PivotTables. Not available in formulas — you’ll need =K2/SUM(K2:N2) manually. |