使用FROM子句中的子查询连接两个表

时间:2014-11-13 19:08:50

标签: sql-server

我对我在家庭作业上遇到的这个问题失去了理智。 不,我不想要你给我答案!我只是想被推向正确的方向,因为我一直在努力解决这个问题。

这是一个问题。

  

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

     

编写第二个SELECT语句,该语句在其FROM子句中使用第一个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.

非常感谢任何帮助!

4 个答案:

答案 0 :(得分: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  

答案 1 :(得分:0)

当任务需要使用选择表单时,选择一个解决方案可能是Common Table Expression所谓的CTE允许您定义一个结果,您可以在以后的quires中进一步使用该结果。

示例:

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;

答案 2 :(得分: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;

答案 3 :(得分:0)

基于问题,第一个查询是第二个查询的子查询。

SELECT email_address, MAX(order_total) as max_order_total,MIN(order_id) as min_order_id  
FROM(
  SELECT email_address, order_items.order_id, SUM((item_price-discount_amount)*quantity) as order_total 
  FROM customers INNER JOIN orders
    ON customers.customer_id=orders.customer_id
    INNER JOIN order_items
    ON orders.order_id=order_items.order_id
  GROUP BY email_address,order_items.order_id
)v
GROUP BY email_address
ORDER BY max_order_total DESC