Как сделать так, чтобы мое предложение WHERE не запускало синтаксическую ошибку в SQL? - PullRequest
0 голосов
/ 19 февраля 2019

Вопросы спрашивают,

"Напишите запрос, чтобы отобразить имя клиента и количество совершенных им платежей, если сумма по чеку превышает их среднюю сумму. Закажите результаты по убываниюколичество платежей. "

Пока у меня есть,

 SELECT customerName, 
                (SELECT COUNT(checkNumber) FROM Payments WHERE 
                 Customers.customerNumber = Payments.customerNumber) AS
                 NumberOfPayments
FROM Customers
WHERE amount > SELECT AVG(amount)
ORDER BY NumberOfPayments DESC; 

Но я получаю синтаксическую ошибку каждый раз, когда у меня заканчивается.Что я делаю неправильно в этой ситуации?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Синтаксическая ошибка происходит из-за того, что у вас неверный второй подзапрос: amount > SELECT AVG(amount) не работает.

Вы можете использовать amount > (SELECT AVG(amount) FROM Payments).

То есть: завершеноподзапрос и поместите его между ().

Однако это не будет делать то, что вы хотите (плюс это неэффективно).

Теперь, так как это не форум, чтобы сделать вашу домашнюю работу для васЯ оставлю это на этом и, таким образом, только помогу вам с актуальным вопросом: почему вы получаете синтаксическую ошибку.Продолжайте смотреть, вы найдете это.Нет лучшего способа учиться, чем искать и находить себя.

0 голосов
/ 19 февраля 2019

Я бы подошел к этому, используя 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,Я думаю, что это важно, потому что два клиента могут иметь одинаковое имя.

0 голосов
/ 19 февраля 2019

Я бы сформулировал это как внутреннее соединение двух таблиц с коррелированным подзапросом, чтобы найти среднюю сумму платежа на одного клиента:

SELECT
    c.customerName,
    COUNT(CASE WHEN p.amount > (SELECT AVG(p2.amount) FROM Payments p2
                                WHERE p2.customerName = c.customerName)
               THEN 1 END) AS NumberOfPayments
FROM Customers c
INNER JOIN Payments p
    ON c.customerNumber = p.customerNumber
GROUP BY
    c.customerNumber
ORDER BY
    NumberOfPayments DESC;

Ваш текущий запрос находится на правильном пути, но вам нужносделать то, что называется условной агрегацией, чтобы получить количество.В этом случае мы агрегируем по клиенту, а затем утверждаем, что данная сумма платежа больше, чем его среднее значение, прежде чем включить ее в подсчет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...