查找订单的平均美元金额

时间:2013-04-11 23:21:59

标签: sql sql-server-2008

我试图找到订单的平均美元金额。我已经计算了平均订单总数,但我需要一个平均值,考虑到并非所有订单都有相应的OrderItems。

这是一个家庭作业问题,如下:

  

订单的平均$$值是多少?要得到答案,你需要   将所有订单值相加并除以   订单数量。这个问题有两种可能的平均值,   因为并非ORDERS表中的所有订单号都在   ORDERITEMS表...您将计算并显示两个平均值。

我写了一个忽略没有OrderItem的订单,但不确定如何处理第二种情况。

    SELECT SUM(OrderItems.qty*INVENTORY.price)  / COUNT(*) AS dollarValue
    FROM Orders, OrderItems, Inventory
    WHERE ORDERS.orderid = OrderItems.orderid AND OrderItems.partid = Inventory.partid 

Link To DB Diagram enter image description here

2 个答案:

答案 0 :(得分:1)

Avg函数不会将NULL替换为零;它会从计算中排除NULL。如果您有Order行没有OrderItem,则需要使用左连接。您可以在SQL Server中使用的技巧是嵌套连接(请注意括号):

Select Avg(OI.Qty * I.Price)
From Orders As O
    Left Join (OrderItems As OI
        Join Inventory As I
            On I.PartId = OI.PartId)
        On OI.OrderId = O.OrderId

这会将Inventory表加入到OrderItems之前它左连接结果到Orders表。通过这种方式,OI.QtyI.Price同时返回NULL的订单,这些订单没有OrderItem并被排除在计算之外。对上述方法的等效方法是使用两个左连接:

Select Avg(OI.Qty * I.Price)
From Orders As O
    Left Join OrderItems As OI
        On OI.OrderId = O.OrderId
    Left Join Inventory As I
        On I.PartId = OI.PartId

如果您想将没有OrderItems的订单计为零,那么您需要使用Coalesce将这些空值转换为零:

Select Avg(OI.Qty * I.Price) As Avg_ExcludingNull
    , Avg( Coalesce(OI.Qty * I.Price,0) ) As Avg_NullAsZero
From Orders As O
    Left Join (OrderItems As OI
        Join Inventory As I
            On I.PartId = OI.PartId)
        On OI.OrderId = O.OrderId

答案 1 :(得分:0)

SQL有一个用于计算平均值的聚合函数:AVG()

SELECT AVG(OrderItems.qty*INVENTORY.price) AS dollarValue
FROM Orders, OrderItems, Inventory
WHERE ORDERS.orderid = OrderItems.orderid AND OrderItems.partid = Inventory.partid 

虽然我们在这里,但我建议您使用更现代的JOIN语法:

SELECT AVG(OrderItems.qty*INVENTORY.price) AS dollarValue
FROM Orders
JOIN OrderItems ON ORDERS.orderid = OrderItems.orderid
JOIN Inventory ON OrderItems.partid = Inventory.partid