Learn SQL/Advanced/CTEs/SQL CTE with Aggregation

SQL CTE with Aggregation

Pre-compute the grouped numbers inside the CTE — the outer query just reads finished results.

What & Why

Aggregating inside a CTE keeps the calculation and the filtering on top of it visually separate — you compute the numbers in one named step, then filter or sort them in the next.

See How It Works

BUSINESS QUESTION

Count total and converted leads for each campaign ID.

idcampaign_idemailcreated_atqualified_atconverted_atlead_scoresourcecountry
3011ana@example.com2024-01-21 09:10:00+002024-01-22 11:00:00+002024-02-02 10:00:00+0086google_adsUS
3021ben@example.com2024-01-24 12:40:00+00NULLNULL52google_adsCA
3032chloe@example.com2024-02-16 08:30:00+002024-02-18 14:20:00+00NULL74emailGB
3043dev@example.com2024-03-20 17:15:00+002024-03-21 09:00:00+002024-04-04 16:00:00+0091linkedinUS
EXAMPLE QUERY
WITH lead_summary AS (
  SELECT
    campaign_id,
    COUNT(*) AS leads,
    COUNT(*) FILTER (WHERE converted_at IS NOT NULL) AS conversions
  FROM marketing.leads
  WHERE campaign_id IS NOT NULL
  GROUP BY campaign_id
)
SELECT
  campaign_id,
  leads,
  conversions
FROM lead_summary
ORDER BY leads DESC, campaign_id;
RESULT — lead summary by campaign ID
campaign_idleadsconversions
121
210
311

The CTE returns only campaign IDs present in marketing.leads, ordered by lead count and then campaign ID.

This lesson's practice is part of Pro.

Advanced business practice

Sign up free to try it on a real business scenario