问题问,
“写一个查询以显示客户名称和他们在支票上的金额大于其平均付款金额时所支付的金额。按递减的顺序对结果进行排序。”
到目前为止,我已经拥有
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;
但是每次用完我都会遇到语法错误。在这种情况下我做错了什么?
答案 0 :(得分:1)
语法错误来自以下事实:您有不正确的第二个子查询:amount > SELECT AVG(amount)
不起作用。
您可以使用amount > (SELECT AVG(amount) FROM Payments)
。
也就是说,完成子查询并将其放在()之间。
但是,这不能满足您的要求(而且效率低下)。
现在,既然这不是一个为您做功课的论坛,我将留在这里,这样只会为您提供一个实际的问题:为什么会出现语法错误。继续寻找,您会找到它。没有比搜索和发现自己更好的学习方法。
答案 1 :(得分:0)
我将其表述为两个表之间的内部联接,并使用相关子查询来查找每个客户的平均付款金额:
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;
您当前的查询在正确的轨道上,但是您需要执行一些称为条件聚合的操作来获取计数。在这种情况下,我们将按客户进行汇总,然后断言给定的支付金额大于其平均金额,然后再将其计入计数。
答案 2 :(得分:0)
我将只使用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
。我认为这很重要,因为两个客户可能有相同的名字。