Mysql 如何使我的WHERE子句在SQL中不运行语法错误?
问题是 写一个查询,显示支票金额大于平均付款金额的客户姓名和付款次数。按付款数量降序排列结果 到目前为止,Mysql 如何使我的WHERE子句在SQL中不运行语法错误?,mysql,sql,Mysql,Sql,问题是 写一个查询,显示支票金额大于平均付款金额的客户姓名和付款次数。按付款数量降序排列结果 到目前为止, SELECT customerName, (SELECT COUNT(checkNumber) FROM Payments WHERE Customers.customerNumber = Payments.customerNumber) AS NumberOfPayments FRO
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;
但每次用完时都会出现语法错误。在这种情况下我做错了什么?我将其表述为两个表之间的内部联接,并使用相关子查询查找每个客户的平均付款金额:
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;
您当前的查询是正确的,但是您需要执行一种称为条件聚合的操作来获取计数。在这种情况下,我们先按客户汇总,然后断言给定的付款金额大于他的平均金额,然后再将其包括在计数中。语法错误源于您的第二个子查询不正确:amount>SELECT AVGamount不起作用 您可以使用金额>从付款中选择AVGamount 也就是说:完成子查询并将其放在两个查询之间 然而,这不会做你想要的,而且效率很低
既然这不是一个为你做家庭作业的论坛,我将把它留在这里,因此只会帮助你解决一个实际问题:你为什么会出现语法错误。继续找,你会找到的。没有比搜索和发现自己更好的学习方法了。我会使用连接来实现这一点: 关于这个答案的一些注释。首先,它使用左连接和条件聚合。这允许查询返回零付款大于平均值的客户,即没有付款或所有付款相同的客户
其次,它将customerNumber包含在GROUP BY中。我认为这一点很重要,因为两个客户可能有相同的名字。您使用的是什么版本的SQL?@TimBiegeleisen我的SQL Workbench版本8.0.13所以当我写到查询不起作用时,我错了?这个查询实际上会做他描述的事情?如果你没有提供原始问题的实际答案,那么你应该把它作为一个评论。不知怎的,你得到了两张选票和绿色的复选标记。看看这个主题。问题是:为什么我会出错。不是:做我的家庭作业。这就是我所做的。
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;