Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使我的WHERE子句在SQL中不运行语法错误?_Mysql_Sql - Fatal编程技术网

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;