2016-07-21 12 views
1

Ich habe 3 Tische.Ist es möglich, diese SQL-Abfrage zu vereinfachen?

'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

Ich habe die Informationen über Personen erhalten, die weniger mit einem Durchschnittspreis von mehr als 10 Produkte bestellt als 17. Ich tue dies, aber ich bin nicht sicher, wenn es der beste Ansatz ist.

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

Bedeutet "bestellte mehr als 10 Produkte" in einer einzigen Bestellung oder in allen ihren Bestellungen? –

+0

@ CL. über alle ihre Bestellungen –

+0

Was bedeutet "mehr als 10 produziert mit einem Durchschnittspreis von weniger als 17"? Die Produkte, die Sie auswählen, die am Ende mehr als 10 sind, sollten einen Durchschnitt von weniger als 17 haben? Oder meinst du "Leute, die mehr als 10 Produkte bestellt haben und ** alle Produkte, die sie bestellt haben, einen Durchschnitt von weniger als 17 haben"? –

Antwort

0

können Sie die "having" clause verwenden, um Datensätze zu filtern, in denen die Aggregate (Summe, Anzahl etc.) einen bestimmten Satz von Kriterien erfüllen.

Es wäre so etwas wie:

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

versuchen diese, nicht sicher, dass es, wie sie dies nicht überprüft wird funktionieren.

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 
Verwandte Themen