Я бы подошел к этому, используя JOIN
s:
SELECT c.customerName,
SUM( p.amount > p2.avg_amount ) as Num_Payments_Larger_Than_Average
FROM Customers c LEFT JOIN
Payments p
ON c.customerNumber = p.customerNumber LEFT JOIN
(SELECT p2.customerNumber, AVG(amount) as avg_amount
FROM payments p2
GROUP BY p2.customerNumber
) p2
ON p2.customerNumber = p.customerNumber
GROUP BY c.customerNumber, c.customerName
ORDER BY Num_Payments_Larger_Than_Average;
Некоторые примечания к этому ответу.Во-первых, он использует LEFT JOIN
и условную агрегацию.Это позволяет запросу возвращать клиентов с нулевыми платежами, превышающими их средние показатели, то есть клиентов без платежей или со всеми одинаковыми платежами.
Во-вторых, он включает customerNumber
в GROUP BY
,Я думаю, что это важно, потому что два клиента могут иметь одинаковое имя.