【问题标题】:using a subquery with a having使用带有 have 的子查询
【发布时间】:2020-09-17 23:01:39
【问题描述】:

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

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 的结果。

【问题讨论】:

  • 数据库是什么?

标签: sql sum subquery average having-clause


【解决方案1】:

你的意思可能是:

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

  • 不需要inhaving 子句中的类似内容:只需将客户的平均值与计算整体的标量子查询进行比较

注意事项:

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

  • 表别名使查询更易于编写和阅读;用它们所属的表的别名作为前缀使查询易于理解

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-06-23
  • 2015-02-01
  • 1970-01-01
  • 2014-03-02
  • 2013-06-12
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多