1

注文の平均金額を見つけようとしています。注文合計の平均を計算しましたが、すべての注文に対応する OrderItems があるわけではないという事実を考慮した平均が必要です。

これは宿題で、次のような問題です。

注文の平均$$値はいくらですか? 答えを得るには、すべての注文値を合計し、これを注文数で割る必要があります。ORDERS テーブルのすべての注文番号が ORDERITEMS テーブルにあるわけではないため、この質問には 2 つの平均が考えられます。両方の平均を計算して表示します。

OrderItem のない注文を無視するものを書きましたが、2 番目のケースについてどうすればよいかわかりません。

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

DB ダイアグラムへのリンクここに画像の説明を入力

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

これにより、テーブルが左結合されるInventoryに、OrderItemsテーブルがテーブルに結合されます。このように、両方ともOrderItems を持たない Orders を返し、計算から除外されます。上記と同等のアプローチは、2 つの Left Join を使用することです。OrdersOI.QtyI.PriceNULL

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 のない Orders をゼロとしてカウントしたい場合は、以下を使用してこれらの null をゼロに変換する必要があります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 に答える