Write a query to identify vendors whose invoice amounts differ by more than 15% from their historical average.
-
SQL
- Write a SQL query to find the second highest salary from an Employees table without using LIMIT or TOP.
- Write a query to find all customers who placed orders in every month of 2025.
- Write a query to identify duplicate rows in a Transactions table based on customer_id, amount, and date.
- Write a query using GROUP BY and HAVING to find departments with more than 10 employees earning above the department average salary.
- Write a query to return the top 3 selling products per category using a subquery (no window functions allowed).
- Write a query to calculate the running total of daily revenue for a store using a self-join.
- Write a query to find the average order value per customer segment, excluding cancelled orders.
- Write a query to find employees who earn more than their direct manager, using a self-join on an Employees table.
- Write a query to list all customers who have not placed any order in the last 90 days.
- Write a query to compute the percentage of total revenue contributed by each product category.
- Write a query to find the first purchase date and last purchase date for every customer.
- Write a query to find the three most recent orders for each customer.
- Write a query that returns customers whose total spend is above the 90th percentile of all customers.
- Write a query to find customers who bought Product A but never bought Product B.
- Write a query to count how many orders each customer placed and rank customers by order count within their city.
- Write a query to identify the busiest hour of the day for support ticket creation using a Tickets table.
- Write a query to find the top 5 referral sources by conversion rate from a Signups table.
- Write a query using EXISTS to find suppliers who have never had a late delivery.
- Write a query to detect gaps in a sequential invoice_number column.
- Write a query to find all products whose price increased in the last price update compared to the previous one.
- Write a query to calculate month-over-month growth rate in active users from a DailyActiveUsers table.
- Write a query to return the department with the highest average tenure of employees.
- Write a query to find all orders placed on weekends versus weekdays and compare average order value.
- Write a query to find customers who upgraded their subscription plan more than once in the last year.
- Write a query to return the top 10% of sales reps by revenue generated in Q1.
- Write a query using a CTE to calculate a 7-day moving average of website visits.
- Write a query to find all patients who missed at least two scheduled appointments in the past year.
- Write a query to identify employees who have never taken a single day of leave in the last two years.
- Write a query to compute year-over-year revenue comparison for each region using self-joins.
- Write a query to find the longest streak of consecutive days a user logged into an app.
- Write a query to identify vendors whose invoice amounts differ by more than 15% from their historical average.
- Write a query to find all students who scored above the class average in more than 3 subjects.
- Write a query to detect accounts with more than 5 failed login attempts within a 10-minute window.
- Write a query to find the second most frequently ordered item for each customer.
- Write a query to identify products frequently bought together, based on an OrderItems table.
- Write a query to find the average time between a support ticket being opened and first responded to, grouped by priority.
- Write a query to find the top-selling product in each store location for the current quarter.
- Write a query to list all foreign keys referencing a given table in a schema (engine-specific system tables allowed).
- Write a query to compute the cumulative distinct count of new customers acquired each month.
Answer
Compute each vendor's historical average invoice amount, then flag invoices that deviate from it by more than 15% in either direction.
Solution
WITH vendor_avg AS (
SELECT vendor_id, AVG(invoice_amount) AS avg_amount
FROM Invoices
GROUP BY vendor_id
)
SELECT i.invoice_id, i.vendor_id, i.invoice_amount, v.avg_amount,
ROUND(100.0 * (i.invoice_amount - v.avg_amount) / v.avg_amount, 2) AS pct_deviation
FROM Invoices i
JOIN vendor_avg v ON v.vendor_id = i.vendor_id
WHERE ABS(i.invoice_amount - v.avg_amount) / v.avg_amount > 0.15;Step by Step
- The
vendor_avgCTE computes each vendor's average invoice amount across their full history. - Each individual invoice is joined back to its own vendor's average.
ABS(invoice_amount - avg_amount) / avg_amount > 0.15flags any invoice - whether abnormally high or abnormally low - that differs from that vendor's typical amount by more than 15%.
Alternative: Excluding the Current Invoice from Its Own Average
SELECT i1.invoice_id, i1.vendor_id, i1.invoice_amount,
(SELECT AVG(i2.invoice_amount) FROM Invoices i2
WHERE i2.vendor_id = i1.vendor_id AND i2.invoice_id <> i1.invoice_id) AS avg_amount_excl_self
FROM Invoices i1
WHERE ABS(i1.invoice_amount - (
SELECT AVG(i2.invoice_amount) FROM Invoices i2
WHERE i2.vendor_id = i1.vendor_id AND i2.invoice_id <> i1.invoice_id
)) / (SELECT AVG(i2.invoice_amount) FROM Invoices i2
WHERE i2.vendor_id = i1.vendor_id AND i2.invoice_id <> i1.invoice_id) > 0.15;The first solution includes every invoice - including the one being checked - in its own vendor's average, which means one genuinely huge outlier invoice can pull the average toward itself and make the deviation look smaller than it really is. Excluding the current invoice from its own baseline average (as shown here) gives a cleaner, less self-referential anomaly check, at the cost of a noticeably more complex query.
Key Exam Traps
- Self-inclusion bias is the sophisticated point of this question: Including the invoice being tested inside the average it's being compared against is a subtle statistical flaw - flagging this unprompted, as in the alternative method, is exactly the kind of detail that distinguishes a strong analytics candidate.
- ABS() is required for "differ by more than 15%" - without it, the condition only catches invoices above average by that much, silently missing unusually low invoices, which are often just as suspicious (e.g. potential data entry errors).
- Vendors with very few invoices produce an unstable average that any single invoice heavily influences - flag this as a caveat on the reliability of the result for low-volume vendors.