我试图找到订单的平均美元金额。我已经计算了平均订单总数,但我需要一个平均值,考虑到并非所有订单都有相应的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
答案 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.Qty
和I.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