Skip to content

How to Diagnose a Business Problem Fast (The Gordon Ramsay Blueprint)

    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.

    Subscribe to Analytics in Action →

    Leave a Reply

    Your email address will not be published. Required fields are marked *