CMD Guide
HomeDatabasesSQL Practice Problems

Patient Appointment No-Shows

Problem

Table: Appointments

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| appointment_id | int     |
| patient_id     | int     |
| doctor_id      | int     |
| appointment_date | date  |
| status         | enum    |
+----------------+---------+
appointment_id is the primary key (column with unique values) for this table.
patient_id is the ID of the patient who has the appointment.
doctor_id is the ID of the doctor with whom the appointment is booked.
appointment_date is the date when the appointment is scheduled.
status is an ENUM (category) of type ('Completed', 'Cancelled', 'No-Show').

Problem Definition

Write a solution to find the number of times each patient missed their appointments (status = 'No-Show').

The result should include the patient_id along with the count of missed appointments as no_shows. If a patient has never missed an appointment, their record should not appear in the output.

Return the result table ordered by patient_id in ascending order.

Example

Input: 
Appointments table:
+----------------+------------+-----------+------------------+----------+
| appointment_id | patient_id | doctor_id | appointment_date | status   |
+----------------+------------+-----------+------------------+----------+
| 1              | 1          | 101       | 2020-09-01       | Completed|
| 2              | 2          | 102       | 2020-09-01       | No-Show  |
| 3              | 1          | 103       | 2020-09-02       | Cancelled|
| 4              | 3          | 101       | 2020-09-02       | No-Show  |
| 5              | 2          | 103       | 2020-09-03       | No-Show  |
| 6              | 3          | 102       | 2020-09-03       | Completed|
+----------------+------------+-----------+------------------+----------+
Output: 
+------------+----------+
| patient_id | no_shows |
+------------+----------+
| 2          | 2        |
| 3          | 1        |
+------------+----------+

Try It Yourself

sql
-- TODO: Write your user queries here

Solution

To solve this problem, we use SQL queries to analyze the Appointments table and calculate the number of times each patient missed their appointments (where status = 'No-Show').

The solution involves using the WHERE clause to filter the Appointments table records where the status is 'No-Show'. The COUNT function is then applied to count the number of 'No-Show' appointments for each patient_id.

The results are grouped by patient_id using the GROUP BY clause to ensure that the count is calculated for each patient individually. Finally, the ORDER BY clause is employed to sort the resulting records by patient_id in ascending order, as specified in the problem statement.

SELECT patient_id, COUNT(*) AS no_shows FROM Appointments WHERE status = 'No-Show' GROUP BY patient_id ORDER BY patient_id ASC;

Let's break down the query step by step:

Step 1: Filtering 'No-Show' Appointments

We filter out the records in the Appointments table where the status column is 'No-Show'.

WHERE status = 'No-Show'

Step 2: Grouping by Patient ID

We group the results by patient_id to calculate the count of 'No-Show' appointments for each patient.

GROUP BY patient_id

Step 3: Counting 'No-Show' Appointments for Each Patient

We apply the COUNT function to count the number of 'No-Show' appointments for each patient.

COUNT(*) AS no_shows

Step 4: Ordering the Result

Finally, we order the results by patient_id in ascending order to comply with the problem statement.

ORDER BY patient_id ASC

Final Output:

+------------+----------+ | patient_id | no_shows | +------------+----------+ | 2 | 2 | | 3 | 1 | +------------+----------+

This final result table lists each patient along with the number of appointments they missed, sorted by the patient ID.

Pattern: filter-then-count (vs conditional aggregation)

Name: filter-then-group-count — WHERE status = 'No-Show' first, then GROUP BY patient_id + COUNT(*). Only patients with at least one no-show appear.

Conditional aggregation alternative (keeps zero-no-show patients if you drive from all appointments or a patient list):

SELECT patient_id,
       SUM(CASE WHEN status = 'No-Show' THEN 1 ELSE 0 END) AS no_shows
FROM Appointments
GROUP BY patient_id;
-- patients who never missed show no_shows = 0

-- Spec for this problem typically wants only patients who missed at least once:
-- either keep WHERE status='No-Show', or HAVING SUM(...) > 0

Judgment: WHERE-then-COUNT matches "list patients who have no-shows and how many." Conditional SUM matches "full patient roster with zeros." Read the problem: omitting never-missed patients is correct when the sample does not include zeros.

Wrong approach: COUNT(status='No-Show') — in SQL that counts non-null results of a boolean expression incorrectly depending on engine; use SUM(CASE…) or FILTER (Postgres).

Drill: Using conditional aggregation, return all patient_ids from the sample with their no_shows including zeros. Who has 0?

🎯 STANDOUT elevation: Why / example / when-not / failure / panel / drills — Patient Appointment No-Shows

Why this exists / the decision it encodes

Filter-then-count: WHERE status='No-Show' then GROUP BY patient_id COUNT(*). Only patients with ≥1 no-show appear. The dual pattern is conditional aggregation (SUM CASE) which can keep zeros — read the spec for which set is required.

Worked example with numbers or traced SQL/FD

Sample no-shows: patient 2 (rows 2,5) → 2; patient 3 (row 4) → 1; patient 1 → absent
Filter-then-count:
  WHERE status='No-Show' GROUP BY patient_id → {2:2, 3:1}
Conditional (all patients who appear in Appointments):
  SUM(CASE WHEN status='No-Show' THEN 1 ELSE 0 END)
  → patient 1: 0, 2: 2, 3: 1
  HAVING SUM(...)>0 recovers the problem's non-zero set
Wrong: COUNT(status='No-Show') — not portable conditional count

When NOT / named alternative

Use WHERE-then-COUNT when the problem excludes never-missed patients (this one). Use conditional aggregation for full rosters, rate numerators/denominators in one pass, or multiple status metrics side by side. Drive from Patients LEFT JOIN if you need patients with zero appointments too.

Failure mode / ops fingerprint / interview trap

Trap: counting Cancelled as No-Show by loose filters. Ops: status enum typos create silent undercounts. Interview: explain why patient 1 is missing without reading the "should not appear" line.

Domain judgment (K11 theory-bridge / K12 concurrency / K13 query-judgment)

K13: filter-then-aggregate vs conditional aggregate is a deliberate result-set decision, not two random syntaxes.

Hostile-panel drills (with model answers)

Q1. Why is patient 1 missing from the official output?
Model answer: They have Completed and Cancelled only — no No-Show rows. Filter-then-group never emits a group for them.

Q2. Write conditional aggregation for no_shows including zeros for all appointment patients.
Model answer: SELECT patient_id, SUM(CASE WHEN status='No-Show' THEN 1 ELSE 0 END) AS no_shows FROM Appointments GROUP BY patient_id ORDER BY patient_id;

Q3. Postgres FILTER alternative?
Model answer: COUNT(*) FILTER (WHERE status='No-Show') — clear conditional count; still need a driving set if zeros for never-seen patients are required.

🤖 Don't fully get this? Learn it with Claude

Stuck on Patient Appointment No-Shows? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🎨 Explain it visually

Build the mental picture, not memorization.

I just read a lesson on **Patient Appointment No-Shows** (Databases) and want to truly understand it. Explain Patient Appointment No-Shows from first principles using ONE vivid real-world analogy and a visual mental model — draw it as ASCII art or a clear step-by-step diagram — with a concrete example using real numbers. Then ask me one question to check I got the mental picture, and wait for my reply. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🤔 Walk me through it (interactive)

Socratic — adapts to where you're stuck.

Teach me **Patient Appointment No-Shows** interactively. Ask me ONE guiding question at a time, wait for my answer, and adapt to my confusion — build the idea with me step by step instead of explaining it all at once. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧪 Quiz me & fix my gaps

Active recall exposes what you missed.

Quiz me on **Patient Appointment No-Shows** with 5 questions, easy to tricky, ONE at a time. Tell me if each answer is right; at the end, explain clearly what I got wrong and why. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧠 Make it stick

Intuition + hook + flashcards for long-term memory.

Help me remember **Patient Appointment No-Shows** for the long term: give the one-sentence intuition, a memorable hook/mnemonic, a tiny worked example, and 3 active-recall flashcards (Q -> A). If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes