2016-02-05 91 views
2

我有一个Shippers表和Orders表。要获得每个托运人发送的订单数,我使用以下语句:得到平均数

SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders 
LEFT JOIN Shippers 
ON Orders.ShipperID=Shippers.ShipperID 
GROUP BY ShipperName; 

它工作正常。根据以上声明的结果,我怎样才能得到每个托运人发送的订单的平均数平均数

回答

0

尝试使用子查询

SELECT myT.*, AVG(NumberOfOrders) FROM(

    SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders 
    LEFT JOIN Shippers 
    ON Orders.ShipperID=Shippers.ShipperID 
    GROUP BY ShipperName; 

) myT 
+0

所以'myT'表示我查询的结果表,对吧? –

+0

这是根据子选择结果创建的表的别名。所有子选项都是强制性的(可以是任何名称) –

1

您可以通过使用AVG()函数实现这一目标:

SELECT Shippers.ShipperName, AVG(Orders.OrderID) AS AvgNumberOfOrders 
FROM Orders 
LEFT JOIN Shippers 
ON Orders.ShipperID=Shippers.ShipperID 
GROUP BY ShipperName; 

的更多信息:http://www.w3schools.com/sql/sql_func_avg.asp

0

一种方法是一个子查询:

SELECT AVG(NumberOfOrders) 
FROM (SELECT s.ShipperName, COUNT(o.OrderID) AS NumberOfOrders 
     FROM Orders o LEFT JOIN 
      Shippers s 
      ON o.ShipperID = s.ShipperID 
     GROUP BY s.ShipperName 
    ) t; 

然而,一个更简单的方式就是自己做了分工:

SELECT COUNT(o.OrderID)/COUNT(DISTINCT s.ShipperName) 
FROM Orders o LEFT JOIN 
    Shippers s 
    ON o.ShipperID = s.ShipperID; 

注:两个合理的假设是:每个托运人都有自己的ID,所有托运人有至少一个数量级。如果是这样,你可以简化为:

SELECT COUNT(o.OrderID)/COUNT(DISTINCT l.ShipperId) 
FROM Orders o;