Learn SQL/Advanced/Interview Patterns/SQL Customers with No Orders

SQL Customers with No Orders

One of the most common interview questions — and the wrong tool (NOT IN) has a real, dangerous trap.

What & Why

The customers-with-no-orders pattern keeps a parent row only when no matching child row exists. The same pattern answers Queryflo's internal equivalent: campaigns that have generated no leads.

See How It Works

BUSINESS QUESTION

Find campaigns that have not generated any leads.

idnamechannelspendstart_dateend_datestatustarget_segment
1Spring Launchgoogle_ads55000.002024-01-152024-03-31activesmb
2Retention Webinaremail45000.002024-02-102024-04-15activeenterprise
3Finance Retargetinglinkedin50000.002024-03-122024-05-31activeenterprise
4Enterprise Searchgoogle_ads60000.002024-04-012024-06-30activeenterprise
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
Watch the anti-join find the campaign with no leadsStep 1 of 4
NOT EXISTS marketing.leads for the current campaign
campaign_idcampaignlead_countdecision
1Spring Launch2SKIP
2Retention Webinar1SKIP
3Finance Retargeting1SKIP
4Enterprise Search0KEEP

Spring Launch has two child rows.

EXAMPLE QUERY
SELECT
  c.id,
  c.name,
  c.channel
FROM marketing.campaigns c
WHERE NOT EXISTS (
  SELECT 1
  FROM marketing.leads l
  WHERE l.campaign_id = c.id
)
ORDER BY c.name;

This lesson's practice is part of Pro.

Advanced business practice

Sign up free to try it on a real business scenario