2016-07-21 10 views
1

私は3つのテーブルを持っています。このSQLクエリを簡略化することはできますか?

'Order details' OrderID | Quantity | UnitPrice | ProductID 1002 | 19 | 17 | 824 1003 | 5 | 15 | 285 1004 | 7 | 6 | 543

'Orders' OrderID | CustomerID 1002 | 224 1003 | 224 1004 | 348

'Customers' CustomerID| Name | Phone 224 | John | 235-453 225 | July | 532-232

私はこれをしなかった以下17以上の平均価格で10社の以上の製品を注文した人についての情報を取得する必要がありますが、私はわかりませんもしそれが最良のアプローチであれば。

SELECT * 
FROM customers 
WHERE customerid IN 
    (SELECT DISTINCT customerid 
    FROM orders 
    WHERE orderid IN 
     (SELECT orderid id 
     FROM 'order details' 
     WHERE 17 > 
      (SELECT avg(unitprice) 
      FROM 'order details' 
      WHERE orderid = id 
      GROUP BY orderid) 
      AND 10 < 
      (SELECT sum(quantity) 
      FROM 'order details' 
      WHERE orderid = id 
      GROUP BY orderid) 
     GROUP BY orderid)) 
+0

"10個以上の製品が注文されました"というのは、1つの注文またはすべての注文を意味しますか? –

+0

@CL。すべての注文に対して –

+0

平均価格が17未満の10以上の商品はどういう意味ですか?最終的に10以上の製品を選択すると、平均が17未満になりますか?または、「10以上の商品を注文した**、**注文したすべての商品が平均が17未満」という意味ですか? –

答えて

0

あなたは集計(合計などをカウント)が基準の特定のセットを満たすレコードをフィルタリングする"having" clauseを使用することができます。

それはのようになります。

select customer.Name, 
     count(*), 
     avg(od.unitPrice) 
from customers c 
inner join orders o on c.customerID = o.customerID 
inner join orderDetails od on o.orderID = od.orderID 
group by customer.Name 
having count(*) > 10 
and avg(od.unitPrice) < 17 
0

がこれをチェックしていないとして、それが動作するか、これをないようにしてください。

SELECT 
    avg(od.unitPrice) AS AVGunitPrice, 
    c.Name, 
    c.Phone 
FROM Customer c 
    INNER JOIN Orders o ON o.customerID = c.CustomerID 
    INNER JOIN OrderDetail od ON od.OrderID = o.OrderId 
WHERE od.Quantity > 10 
GROUP BY c.Name, c.Phone 
HAVING avg(od.unitPrice) < 17 
関連する問題