1

我正在尝试查找订单的平均金额。我已经计算了平均订单总数,但我需要一个平均值,以考虑并非所有订单都有相应的 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 

链接到数据库图在此处输入图像描述

4

2 回答 2

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

这将在将结果连接InventoryOrderItems之前将表连接到Orders表。以这种方式,OI.Qty同时I.Price返回NULL没有 OrderItems 的订单并从计算中排除。与上述等效的方法是使用两个左连接:

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
于 2013-04-12T00:09:30.470 回答
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 
于 2013-04-11T23:32:55.603 回答