Hello ,
Lindsey, the CEO, walks up to your desk at 3pm on a Thursday:
“Revenue feels off this quarter. Can you figure out what’s happening before the board call at 4:30?”
You have 90 minutes. No time to build a comprehensive analysis. No time to make it pretty. You need to diagnose the problem — fast — and deliver a clear answer.
This is The Gordon Ramsay Blueprint in action: taste the dish, identify what’s wrong, fix it, plate it for the table. When Gordon Ramsay walks into a struggling restaurant kitchen, he doesn’t ask for a detailed menu history. He tastes the food, identifies the core problems, and acts.
That’s exactly how you should handle urgent analytical requests.
The Four Steps
Step 1: Taste the Dish (Quick Health Check)
Before diagnosing anything, you need a snapshot of the current state. This is your “taste” — a single query that tells you the vital signs:
-- Quick business health check
SELECT
'Total Revenue' AS metric,
'$' || TO_CHAR(SUM(amount), 'FM999,999,999') AS value
FROM payments WHERE payment_status = 'completed'
UNION ALL
SELECT 'Active Customers',
COUNT(DISTINCT customer_id)::text
FROM bookings WHERE status IN ('completed', 'confirmed')
UNION ALL
SELECT 'Avg Booking Value',
'$' || ROUND(AVG(amount)::numeric, 0)::text
FROM payments WHERE payment_status = 'completed'
UNION ALL
SELECT 'Cancellation Rate',
ROUND(
COUNT(*) FILTER (WHERE status = 'cancelled')::numeric
/ COUNT(*) * 100, 1
)::text || '%'
FROM bookings
UNION ALL
SELECT 'Total Expeditions Offered',
COUNT(*)::text
FROM expeditions
UNION ALL
SELECT 'Active Guides',
COUNT(*)::text
FROM guides WHERE is_active = TRUE;
Results:
| Metric | Value |
|——–|——-|
| Total Revenue | $2,300,625 |
| Active Customers | 552 |
| Avg Booking Value | $1,738 |
| Cancellation Rate | 46.9% |
| Total Expeditions Offered | 100 |
| Active Guides | 45 |
In 30 seconds, you know: $2.3M total revenue, 552 active customers, $1,738 average booking, 47% cancellation rate, 100 expeditions served by 45 active guides.
That cancellation rate jumps out immediately. Nearly half of all bookings cancel. That’s your first lead.
Step 2: Identify What’s Wrong (Drill into the Problem)
Now you focus. If Lindsey says “revenue feels off this quarter,” compare quarters:
-- Quarterly revenue comparison
SELECT
EXTRACT(QUARTER FROM b.booking_date)::int AS quarter,
COUNT(*) AS bookings,
ROUND(SUM(p.amount)::numeric, 2) AS quarterly_revenue
FROM bookings b
INNER JOIN payments p ON b.booking_id = p.booking_id
WHERE p.payment_status = 'completed'
AND b.status IN ('completed', 'confirmed')
AND EXTRACT(YEAR FROM b.booking_date) = 2025
GROUP BY EXTRACT(QUARTER FROM b.booking_date)
ORDER BY quarter;
Results:
Q1: 286 bookings, $515,876
Q2: 318 bookings, $555,731
Q3: 147 bookings, $221,724
Q4: 14 bookings, $13,264
Q3 dropped 60% from Q2. That’s dramatic. But is it unexpected? Adventure travel is seasonal — Q3 and Q4 are typically slower periods. So the question becomes: is this drop worse than expected, or is this the normal seasonal pattern?
This is the diagnosis. You’re not just confirming the problem — you’re contextualizing it.
Step 3: Fix the Issue (Identify Root Causes)
Now dig into what’s driving the decline. Is it fewer bookings, lower values, or specific category problems?
-- Q2 vs Q3 breakdown by expedition type
SELECT
e.expedition_type,
COUNT(*) FILTER (
WHERE EXTRACT(QUARTER FROM b.booking_date) = 2
) AS q2_bookings,
COUNT(*) FILTER (
WHERE EXTRACT(QUARTER FROM b.booking_date) = 3
) AS q3_bookings,
ROUND(
(COUNT(*) FILTER (WHERE EXTRACT(QUARTER FROM b.booking_date) = 3)::numeric
- COUNT(*) FILTER (WHERE EXTRACT(QUARTER FROM b.booking_date) = 2)::numeric)
/ NULLIF(COUNT(*) FILTER (WHERE EXTRACT(QUARTER FROM b.booking_date) = 2), 0)
* 100, 1
) AS change_pct
FROM bookings b
INNER JOIN expedition_instances ei ON b.instance_id = ei.instance_id
INNER JOIN expeditions e ON ei.expedition_id = e.expedition_id
INNER JOIN payments p ON b.booking_id = p.booking_id
WHERE p.payment_status = 'completed'
AND b.status IN ('completed', 'confirmed')
AND EXTRACT(YEAR FROM b.booking_date) = 2025
AND EXTRACT(QUARTER FROM b.booking_date) IN (2, 3)
GROUP BY e.expedition_type
ORDER BY change_pct;
This shows you which categories dropped the most. If all categories dropped evenly, it’s a market or seasonal issue. If one category dropped disproportionately, that’s an operational issue specific to that category.
Step 4: Plate it for the Table (Present Clearly)
At 4:15pm, you walk into Lindsey’s office:
“Here’s what I found:
Revenue dropped 60% from Q2 ($556K) to Q3 ($222K). This is consistent with seasonal adventure travel patterns — Q2 is peak booking season.
Two things stand out:
First, our cancellation rate is 47% across all bookings. That means for every two customers who book, nearly one cancels. If we could reduce that by 10 percentage points, we’d recover approximately $150K in annual revenue.
Second, climbing expeditions have the highest cancellation rate (52%). If there’s a product-specific fix — like flexible rebooking or trip preparation resources — it would have the biggest impact there.
My recommendation: Let’s look at when cancellations happen. If they’re last-minute, a pre-departure confirmation process would help. If they’re early, we may have a marketing expectation problem.”
That’s a 60-second verbal summary backed by three queries. Lindsey has what she needs for the board call.
Why This Framework Works Everywhere
The Gordon Ramsay Blueprint isn’t SQL-specific. It’s a diagnostic pattern:
1. Taste (overview) — understand the current state
2. Identify (diagnose) — find where the problem lives
3. Fix (root cause) — understand why it’s happening
4. Plate (communicate) — deliver the findings clearly
This works with any analytical tool — SQL, Excel, Python, Tableau. The thinking pattern is the same. The tool just determines how fast you can execute.
In a spreadsheet, your “taste” might be a pivot table summary. In Python, it might be a pandas `.describe()` call. In Tableau, it might be a pre-built executive dashboard.
The point isn’t the tool. It’s the structured approach to diagnosis.
Building Your Own Quick Health Check
Create a health check query for your own database and save it. When urgent requests come in, you won’t start from scratch:
-- Template: Business Health Check
-- Customize with your tables and key metrics
SELECT 'Total [Primary Metric]' AS metric,
[aggregation] AS value FROM [main_table]
UNION ALL
SELECT 'Active [Entities]', COUNT(DISTINCT [id])::text
FROM [main_table] WHERE [active_condition]
UNION ALL
SELECT 'Avg [Transaction Value]',
'$' || ROUND(AVG([amount])::numeric, 0)::text
FROM [transactions] WHERE [completed_condition]
UNION ALL
SELECT '[Risk Metric]',
ROUND([risk_calculation], 1)::text || '%'
FROM [relevant_table]
Save this as a bookmark or script. Having it ready turns a 15-minute scramble into a 30-second check.
Common Mistakes Under Pressure
Mistake 1: Trying to answer everything at once
Urgent doesn’t mean comprehensive. Answer the specific question first. Offer to follow up with deeper analysis tomorrow.
Mistake 2: Presenting raw query output
Numbers without interpretation aren’t helpful under time pressure. Your executive doesn’t want a table — they want “revenue is down 60% due to seasonality, but cancellation rates are a fixable issue.”
Mistake 3: Not having a health check saved
If the CEO’s question catches you off guard, you need a starting point. Build the health check query before you need it.
Try This Before Your Next Urgent Request
1. Build a health check query for your main business database (5-6 key metrics)
2. Save it somewhere accessible
3. Practice the verbal summary: “Here’s the situation, here’s what stands out, here’s what I recommend”
When the request comes — and it will — you’ll be ready in minutes, not hours.
Until next time,
Brian ([say hi on twitter!](https://twitter.com/briangraves))
—
P.S. The Gordon Ramsay Blueprint is the capstone framework in Module 8 of SQL for Business Impact. It brings together everything from the previous 7 modules into a rapid diagnostic process. Check it out at [sqlforbusinessimpact.com](https://sqlforbusinessimpact.com).
P.P.S. What’s the most urgent analytical request you’ve ever received? How did you handle it? Hit reply — I love these stories. I read every response.
Want More SQL Insights Like This?
Join thousands of analysts getting weekly tips on turning data into business impact.
