Sql server 2008 查找最昂贵最近订单的最有效方法

Sql server 2008 查找最昂贵最近订单的最有效方法,sql-server-2008,Sql Server 2008,我正在努力寻找客户最近购买的最昂贵的商品。我有四个表:客户、订单、订单详细信息和产品代码。所有帐户的电子邮件地址都是唯一的 错误:无法绑定多部分标识符cx.EmailAddress SELECT c.EmailAddress, o.BillingFirstName AS WC_FirstName, o2.LatestOrder FROM Customers c JOIN orders o ON o.customerid = c.customerid JOIN( SEL

我正在努力寻找客户最近购买的最昂贵的商品。我有四个表:客户、订单、订单详细信息和产品代码。所有帐户的电子邮件地址都是唯一的

错误:无法绑定多部分标识符cx.EmailAddress

SELECT c.EmailAddress,
       o.BillingFirstName AS WC_FirstName,
       o2.LatestOrder
FROM Customers c
JOIN orders o ON o.customerid = c.customerid
JOIN( SELECT
            cx.EmailAddress,
            MAX(o.OrderID) AS LatestOrder
      FROM Customers AS cx
      JOIN Orders o ON o.customerid = cx.customerid
      WHERE o.OrderStatus <> 'CANCELLED' AND o.OrderDate > '09/01/2017 00:00'
      GROUP BY EmailAddress) AS o2 on o2.EmailAddress = cx.EmailAddress
 GROUP BY c.EmailAddress,o.BillingFirstName
UPDATE也尝试了另一种方法,但仍然出现错误:无法绑定多部分标识符c.EmailAddress

SELECT 
    c.EmailAddress,
    c.CustomerID,
    o.OrderDate,
    p.Google_Gender,
    p.Google_Age_Group ,
    p.productprice AS Product_Price
FROM 
    Customers c
JOIN 
    orders o ON o.CustomerID = c.CustomerID
JOIN
    (SELECT 
         c.EmailAddress,
         MAX(o.OrderID) AS LatestOrder
     FROM
         Orders o, Customers c 
     WHERE
         o.OrderStatus <> 'CANCELLED' AND
         o.CustomerID = c.CustomerID
     GROUP BY
         c.EmailAddress) AS o2 ON o2.EmailAddress = c.EmailAddress
JOIN
    (SELECT 
         od.*,
         c.EmailAddress,
         row_number() over (partition BY c.EmailAddress
                            ORDER BY od.ProductPrice DESC, o.OrderDate DESC)  AS seqnum
     FROM 
         OrderDetails od
     JOIN 
         Orders o ON od.OrderID = o.OrderID
     JOIN 
         Customers c ON o.CustomerID = c.CustomerID
     JOIN
         (SELECT 
              c.EmailAddress,
              MAX(o.OrderID) AS LatestOrder
          FROM
              Orders o , Customers c
          WHERE
              o.OrderStatus <> 'CANCELLED' AND
              o.CustomerID = c.CustomerID
          GROUP BY
              c.EmailAddress) AS o2 ON o2.EmailAddress = c.EmailAddress
    WHERE 
        o.OrderID = o2.LatestOrder) od ON od.CustomerID = c.CustomerID
                                       AND seqnum = 1
JOIN 
    Products_Joined p ON od.ProductCode = p.ProductCode
FULL JOIN 
    (SELECT p.ProductCode, p.ProductName FROM Products_Joined AS p) AS p2 ON p2.ProductCode = p.Google_Age_Group
WHERE
    AND o.PaymentAmount <> 0
    AND o.OrderID = o2.LatestOrder
GROUP BY 
    c.EmailAddress, o.OrderDate, c.CustomerID, p.productprice,
    p.Google_Age_Group, p.Google_Gender, p.Google_Pattern,
    p.Google_Size, od.ProductName, p.ProductName, p2.productname,
    p.productcode
ORDER BY 
    o.OrderDate DESC, MAX(od.ProductPrice) DESC;

出现该错误是因为cx是o2查询中的内部别名。因此,您可能应该更改此连接条件:

作为o2上的o2.EmailAddress=c.EmailAddress

通过这种方式,您可以将您的o2电子邮件地址和直接来自客户的电子邮件地址连接起来

为了提高性能,如果您像第一次加入客户时那样,通过CustomerID加入客户,而不是通过电子邮件,那会更好

最后,您正在执行MAX of OrderID,它很可能返回最近的订单。考虑到这一点,您可能应该将查询更改为以下内容我猜Amount是字段的名称:

SELECT c.EmailAddress,
       o.BillingFirstName AS WC_FirstName,
       MostExpensiveOrderId = o.OrderId,
       MostExpensiveOrderAmount = o.Amount
FROM Customers c
INNER JOIN (
    SELECT
        CustomerID,
        MAX(Amount)
    FROM Orders
    WHERE OrderStatus <> 'CANCELLED' AND OrderDate > '09/01/2017 00:00'
    GROUP BY CustomerID
) AS omax ON omax.CustomerID = C.CustomerID
INNER JOIN Orders o ON o.CustomerID = c.CustomerID AND o.Amount = omax.Amount
ORDER BY c.EmailAddress, o.BillingFirstName

请注意,在内部查询中不需要Customers表。还请注意,如果最高值与多个订单共享,则通过这种方式,每个客户可以获得多行。

如果查询需要帮助,则应包括表的结构。您没有指定任何金额字段,您只是得到了最新的订单,而不是最昂贵的订单。我建议您不要重复表别名,以免收到令人困惑的错误消息。您有很多子查询,并且总是使用c作为客户的别名。你确定你想要一个完整的外部联接吗?我已经用我正在尝试的其他方法更新了查询,但是仍然得到那个couldnotbound错误。客户的电子邮件地址是唯一的,而不是唯一的。这就是为什么我要尝试加入,但仍然得到错误的原因。Stomerid不是唯一的?我希望你不是这个意思。通过ID加入,特别是如果是PK,总是比通过varchar字段加入快。而且更清楚。