2014-11-13 128 views
1

我对我在作业中遇到的这个问题失去了主意。不,我不希望你给我答案!我只是想被推向正确的方向,因为我一直在努力。在FROM子句中使用子查询连接两个表格

这是问题。

编写一条SELECT语句,返回三列:EmailAddress,OrderID和每个客户的订单总数。为此,您可以按EmailAddress和OrderID列对结果集进行分组。另外,您必须从OrderItems表中的列中计算订单总额。

编写在其FROM子句中使用第一个SELECT语句的第二个SELECT语句。主查询应返回两列:客户的电子邮件地址和该客户的最大订单。为此,您可以按EmailAddress列对结果集进行分组。

这是我到目前为止有:

SELECT EmailAddress, OrderID, SUM(ItemTotal * Quantity) AS OrderTotal 
FROM Customers JOIN 
    (SELECT OrderID, MAX(ItemTotal * Quantity) AS LargestOrder 
    FROM Orders, OrderItems 
    WHERE OrderItems.OrderID = Orders.OrderID) 
GROUP BY EmailAddress; 

的表设置的方法是:

Customers Table: 
CustomerID, EmailAddress, Password, FirstName, LastName, ShippingAddressID, BillingAddressID 

OrderItems Table: 
ItemID, OrderID, ProductID, ItemPrice, DiscountAmount, DiscountTotal, PriceTotal, ItemTotal, Quantity 

Order Table: 
OrderID, CustomerID, OrderDate, ShipAmount, TaxAmount, ShipDate, ShipAddressID, CardType, CardNumber,CardExpires, BillingAddressID. 

任何帮助将不胜感激!

回答

1

您缺少连接中的ON以及连接中选择的别名。您还需要订单来源,以便将其添加到您的查询中。

SELECT c.emailaddress, 
     Max(OrderCost) AS LargestOrder 
FROM customers c 
     INNER JOIN orders o 
       ON c.customerid = o.customerid 
     JOIN (SELECT orders.orderid, 
        itemtotal * quantity AS OrderCost 
      FROM orders, 
        orderitems 
      WHERE orderitems.orderid = orders.orderid)largest 
     ON largest.orderid = o.orderid 
GROUP BY c.emailaddress 
+0

我加了变化和运行的代码,我发现了一个不明确的列名“订单ID”错误 – jfritts6524

+0

我有资格的订单。确保您的成本正在使用适当的列。 – Josh

+0

太棒了!那工作! – jfritts6524

0

当任务需要使用一个选择的形式选择的解决方案可能是Common Table Expression所谓的CTE允许你定义,你可以在后面奎雷斯进一步上使用的结果。

例子:

WITH Sales_CTE (SalesPersonID, NumberOfOrders) 
AS 
(
    SELECT SalesPersonID, COUNT(*) 
    FROM Sales.SalesOrderHeader 
    WHERE SalesPersonID IS NOT NULL 
    GROUP BY SalesPersonID 
) 
SELECT AVG(NumberOfOrders) AS "Average Sales Per Person" 
FROM Sales_CTE; 
GO 

所以要解决你的情况:

WITH ORDER_TOTAL (EmailAddress, OrderID, OrderTotal) 
AS 
(
    SELECT EmailAddress, OrderID, SUM(i.ItemTotal) as OrderTotal 
    FROM Orders o INNER JOIN OrderItems i on o.OrderID = i.OrderID 
    GROUP BY EmailAddress, OrderID 
) SELECT EmailAddress, MAX(OrderTotal) as MaxOrder 
    FROM ORDER_TOTAL 
    GROUP BY EmailAddress; 
0
SELECT k.email_address, MAX(k.order_total) AS largest_order 
FROM (SELECT c.email_address, o.order_id, ((oi.item_price-oi.discount_amount)*oi.quantity) AS order_total 
FROM customers c JOIN orders o 
ON c.customer_id =o.customer_id 
JOIN order_items oi 
ON o.order_id = oi.order_id 
GROUP BY c.email_address, o.order_id) as k 
GROUP BY k.email_address;