代码之家  ›  专栏  ›  技术社区  ›  Jako

返回高于平均值的行

  •  1
  • Jako  · 技术社区  · 8 年前

    我试图找出订单数量高于平均水平的国家。这是我能做的。问题是(见图),每个国家的订单数量都是关闭的,因为每个国家的订单数量应该不同

      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

    1 回复  |  直到 8 年前
        1
  •  2
  •   dnoeth    8 年前

    如果您的DBMS支持 窗口聚集

    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
    

    编辑:

    对于不支持 窗口聚集

    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
     )