使用带有 having 的子查询

using a subquery with a having

因此,我们的目标是获取平均订购量超过所有客户总平均值的客户列表。

Select customerNumber, customerName, orderNumber, SUM(quantityOrdered)as 'total_qty', ROUND(AVG(quantityOrdered),2) as 'avg'
From customers
join orders using(customerNumber)
join orderdetails using (orderNumber)
Group by customerNumber, OrderNumber
Having ROUND(AVG(quantityOrdered),2) > ROUND(AVG(quantityOrdered),2) IN
        (SELECT ROUND(AVG(quantityOrdered),2) FROM orderdetails)
ORDER BY customerName;

我的代码运行了,但它没有过滤 avg quantity ordered 列上的结果,只显示总平均值超过 35.22 的结果。

可能,你的意思是:

select c.customernumber, c.customername, 
    sum(od.quantity_ordered) as sum_qty,
    round(avg(od.quantity_ordered), 2) as avg_dty
from customers c
join orders o using(customerNumber)
join orderdetails od using (orderNumber)
group by customernumber, customername
having avg(od.quantity_ordered) > (select avg(quantity_ordered) from orderdetails)

理由:

  • 您讨论了计算平均订购量,但您的查询所做的是比较每个客户的平均订单详细信息数量;这假设后者是你想要的

  • 那么:既然你想要平均每个客户,所以不要把订单号放在group by

  • 不需要在 having 子句中使用 in 或 the-like:只需将客户的平均值与计算总体

备注:

  • 不要对标识符(例如列别名)使用单引号 - 它们适用于文字字符串

  • table 别名使查询更易于编写和阅读;在所有列前加上它们所属的 table 的别名使得查询易于理解