【问题标题】:Return the rows that are above average返回高于平均水平的行
【发布时间】:2017-07-17 15:48:20
【问题描述】:

我正在尝试查找订单数量高于平均水平的国家/地区。这是我得到的。问题是(见图)每个国家/地区的订单数量都关闭了,因为每个国家/地区的订单数量应该不同

  SELECT avg(NumberOrders) as avg, 
         Customers.Country, 
         NumberOrders
    FROM Customers,
          (SELECT COUNT(Orders.OrderId) AS NumberOrders 
             FROM Customers JOIN 
                  Orders ON Customers.CustomerID = Orders.CustomerID
         GROUP BY Customers.Country) nested
GROUP BY Customers.Country
  HAVING NumberOrders > avg;

Output

【问题讨论】:

  • 你的 DBMS 是什么?
  • 我正在使用 db browser for sqlite。
  • 数据库是北风
  • 总平均值(所有国家)还是国家平均值?
  • 总平均,所有国家订单数的平均值

标签: sql count average


【解决方案1】:

如果您的 DBMS 支持 Windowed Aggregates(几乎所有除了 MySQL 和 Access):

select *
from
 (
   SELECT Customers.Country, 
      COUNT(Orders.OrderId) AS NumberOrders,  -- count per country
      AVG(COUNT(Orders.OrderId)) OVER () AS avgOrders -- average count
   FROM Customers
   JOIN Orders 
     ON Customers.CustomerID = Orders.CustomerID
   GROUP BY Customers.Country
 ) nested
WHERE NumberOrders > avgOrders

编辑:

对于不支持 Windowed Aggregates 的 DBMS,情况要复杂得多:

SELECT Customers.Country, 
   COUNT(Orders.OrderId) AS NumberOrders  -- count per country
FROM Customers
JOIN Orders 
  ON Customers.CustomerID = Orders.CustomerID
GROUP BY Customers.Country
HAVING COUNT(Orders.OrderId) >
 ( select avg(NumberOrders)
   from
    (
      SELECT Customers.Country, 
         COUNT(Orders.OrderId) AS NumberOrders  -- count per country
      FROM Customers
      JOIN Orders 
        ON Customers.CustomerID = Orders.CustomerID
      GROUP BY Customers.Country
    ) AS dt
 )

如果 DBMS 支持通用表表达式,这可以简化:

with cte as
 (
   SELECT Customers.Country, 
      COUNT(Orders.OrderId) AS NumberOrders  -- count per country
   FROM Customers
   JOIN Orders 
     ON Customers.CustomerID = Orders.CustomerID
   GROUP BY Customers.Country
 ) 
select *
from cte
WHERE NumberOrders >
 (
   select avg(NumberOrders) from cte
 )

【讨论】:

  • 你没有使用窗口化。
  • 非常感谢您的意见!不幸的是,似乎存在语法错误,我无法弄清楚在哪里
  • @Jako:基于您正在使用的一个 cmets sqlite,它不支持 OVER
  • @Jako:我为旧的 DBMSes 添加了一个解决方案 :-)
  • @dnoeth,非常感谢您的见解!我仍然没有得到任何结果:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多